我需要帮助来创建一个我遇到困难的脚本。
MemberId BeginDate EndDate Output
1039725910 3/1/2014 8/10/2014 0 End on 10th August
1039725910 8/11/2014 11/10/2014 1 Start on 11th August, 1 day gap
1039725910 11/11/2014 12/31/2014 1 Start on 11th August, 1 day gap
1166164140 1/1/2014 4/30/2039 0 End on 30 April
1166164140 2/5/2014 12/30/2039 2 Start on 1st May, Here is a 2 days gap
这里对于一个成员,我有三个不同的开始和结束日期。对于每个成员的第一个记录,它将为0,对于第二个记录,差距将是(第二个Begindate - 第一个EndDate)。对于第3条记录,差异将是(第3个开始日期 - 第2个EndDate)依此类推......我无法附加任何屏幕截图。
请帮助我。
此致 拉坦
答案 0 :(得分:0)
您可以使用ROW_NUMBER()
尝试使用如下所示的查询:
select *,
case when rno = 1 then 0
else datediff(day, begindate,enddate) end as difference
from
(select *, row_number() over (partition by MemberId order by MemberId) as rno from members)
tbl
检查以下演示代码:
答案 1 :(得分:0)
您可以将row_number()
窗口函数与自联接一起使用,以访问由MemberId分区的上一行,如下所示:
select
a.MemberId,
a.BeginDate,
a.EndDate,
Output = ISNULL(DATEDIFF(DAY, isnull(b.EndDate, a.BeginDate), a.BeginDate), 0)
from
(select *, rn = ROW_NUMBER() over (partition by memberid order by begindate) from members) a
left join
(select *, rn = ROW_NUMBER() over (partition by memberid order by begindate) from members) b
on a.MemberId = b.MemberId and a.rn - 1 = b.rn
使用您的示例数据,这将为您提供:
MemberId BeginDate EndDate Output
1039725910 2014-03-01 2014-08-10 0
1039725910 2014-08-11 2014-11-10 1
1039725910 2014-11-11 2014-12-31 1
1166164140 2014-01-01 2039-04-30 0
1166164140 2014-05-02 2039-12-30 -9129
如果您需要忽略年份组件,则必须进行日期算术。