【发布时间】:2015-12-31 11:56:00
【问题描述】:
我有如下数据。在这个我需要找到他们月份的差异应该> = 6的行。逻辑应该是,我们需要从第一行进行比较,直到我们得到月份差异为6的行,然后需要遵循相同的逻辑从新匹配的行开始。
我在示例数据和预期输出下方添加。
Fromdate LectureiD StudentID Diff Months Expected
1-Oct-13 1102 55586 null
15-Oct-13 1102 55586 0
15-Oct-13 1102 55586 0
4-Apr-14 1102 55586 6
19-Dec-14 1102 55586 8
27-Dec-14 1102 55586 0
14-Jan-15 1102 55586 0
14-Jan-15 1102 55586 0
29-Sep-15 1102 55586 8
1-Oct-13 1102 55557 null
15-Oct-13 1102 55557 0
15-Oct-13 1102 55557 0
4-Apr-14 1102 55557 6
19-Dec-14 1102 55557 8
以下是我在oracle中使用解析函数尝试的逻辑。
select lectureid,
studentid,
floor(months_between(fromdate,
lag(fromdate) over (partition by
lectureid,
studentid
order by fromdate
)
)
) monthdiff
from above_table;
由于延迟函数的默认偏移量为 1,它只检查之前的行,因为我上面提到的逻辑在这里不能正常工作,因为需要根据新的动态检查它们之前的行匹配的行。所以这里的o/p如下。
因为这个原因,用星号突出显示的行出错了,因为它只与它的前一行进行比较。
Fromdate LectureiD StudentID Diff Month
1-Oct-13 1102 55586 null
15-Oct-13 1102 55586 0
15-Oct-13 1102 55586 0
*4-Apr-14 1102 55586 5*
19-Dec-14 1102 55586 8
27-Dec-14 1102 55586 0
14-Jan-15 1102 55586 0
14-Jan-15 1102 55586 0
29-Sep-15 1102 55586 8
1-Oct-13 1102 55557 null
15-Oct-13 1102 55557 0
15-Oct-13 1102 55557 0
*4-Apr-14 1102 55557 5*
19-Dec-14 1102 55557 8
这里的任何帮助将不胜感激!!!
【问题讨论】:
-
我已经在上面提到了正确的数据集..我刚刚提到了最后一个数据集以突出显示哪里出错了..Thx
-
对不起,我相信它没有很好地对齐。最后一列不是学生 id 它是 o/p 列(diffmonth)
-
对于
*4-Apr-14 1102 55586 5*学生1102那一行,如果第一次约会也是15-Oct-13会是什么结果 -
当上一行匹配
>=6规则时,为什么19-Dec-14 1102 55586应该是 8? -
@JorgeCampos - 如果第一个日期也是 2013 年 10 月 15 日,那么它应该是 5,因为他们几个月的差异将是 5
标签: sql oracle oracle11g lag lead