我有一张桌子:
表1
tran_id user_id start_date end_date
1 100 01-04-2018 02-04-2018
2 100 14-06-2018 14-06-2018
4 100 12-06-2018 12-06-2018
7 101 05-01-2018 05-01-2018
9 101 08-01-2018 08-01-2018
3 101 03-01-2018 03-01-2018
日期格式为DD-MM-YYYY
我需要找到按user_id
和start_date
排序的日差。查找日差的公式是减去前一个记录的end_date
和下一个记录的start_date
。
这是预期的输出:
tran_id user_id start_date end_date day_diff
1 100 01-04-2018 02-04-2018 71
4 100 12-06-2018 12-06-2018 2
2 100 14-06-2018 14-06-2018 0
3 101 03-01-2018 03-01-2018 2
7 101 05-01-2018 05-01-2018 3
9 101 08-01-2018 08-01-2018 0
如何在SQL查询中获取此信息?
答案 0 :(得分:1)
使用函数lead()
查找下一个值,然后减去日期:
select tran_id, user_id, start_date, end_date, nvl(nsd - start_date, 0) diff
from (
select t.*, lead(start_date) over (partition by user_id
order by start_date) nsd
from table1 t)
答案 1 :(得分:1)
您可以为此使用lead()
。由于lead()
接受三个参数,因此您不需要子查询或处理null
值:
select t.*,
(lead(start_date, 1, start_date) over (partition by user_id order by start_date) -
start_date
) as diff
from t;
答案 2 :(得分:0)
我认为:DATEDIFF function in Oracle与LAG function结合可以为您提供帮助。
答案 3 :(得分:0)
对Ponder Stibbons给出的答案的微小修正。差异以粗体突出显示。
选择tran_id,user_id,开始日期,结束日期,nvl(nsd-结束日期,0)diff 来自( 选择t。*,领先(开始日期)超过(按user_id划分) 按start_date排序)nsd 从date_test t)开始;
问候 阿卡什(Akash)