Emi*_*ing 5 sql sql-server window-functions
此处的示例数据:http :
//rextester.com/VNGMF66717
我有以下数据:
ID Year Date
1111 2016 2016-02-28
1111 2016 2016-02-28
1111 2016 2016-03-31
1111 2016 2016-03-31
1111 2016 2016-03-31
1111 2016 2016-04-02
1111 2016 2016-05-31
1111 2016 2016-08-01
1111 2016 2016-12-11
1111 2017 2017-01-02
1111 2017 2017-01-02
1111 2017 2017-02-04
1111 2017 2017-02-04
1111 2017 2017-07-08
2222 2016 2016-02-11
2222 2016 2016-02-11
2222 2016 2016-03-28
2222 2016 2016-03-28
2222 2016 2016-03-28
2222 2016 2016-07-22
2222 2016 2016-12-31
2222 2017 2017-02-01
2222 2017 2017-02-14
Run Code Online (Sandbox Code Playgroud)
我想直接在SELECT语句中使用线索窗口函数添加NextDate列(在每个ID和年份内重置),而不是像提供的示例中那样使用RANK 窗口函数进行自我联接。
NextDate列应完全像这样
ID Year Date NextDate
1111 2016 2016-02-28 2016-03-31
1111 2016 2016-02-28 2016-03-31
1111 2016 2016-03-31 2016-04-02
1111 2016 2016-03-31 2016-04-02
1111 2016 2016-03-31 2016-04-02
1111 2016 2016-04-02 2016-05-31
1111 2016 2016-05-31 2016-08-01
1111 2016 2016-08-01 2016-12-11
1111 2016 2016-12-11 NULL
1111 2017 2017-01-02 2017-02-04
1111 2017 2017-01-02 2017-02-04
1111 2017 2017-02-04 2017-07-08
1111 2017 2017-02-04 2017-07-08
1111 2017 2017-07-08 NULL
2222 2016 2016-02-11 2016-03-28
2222 2016 2016-02-11 2016-03-28
2222 2016 2016-03-28 2016-07-22
2222 2016 2016-03-28 2016-07-22
2222 2016 2016-03-28 2016-07-22
2222 2016 2016-07-22 2016-12-31
2222 2016 2016-12-31 NULL
2222 2017 2017-02-01 2017-02-14
2222 2017 2017-02-14 NULL
Run Code Online (Sandbox Code Playgroud)
有人知道如何正确执行此操作吗?
小智 5
这可能不完全是您的意思,但是通过使用两个带有嵌套选择的窗口函数:MAX(LEAD),您可以获得所需的结果。
select
id, yr, dt
,MAX(nx_dt) OVER (PARTITION BY id, dt) nxt_dt
FROM
(
select
*
, LEAD(dt) OVER (PARTITION BY id, yr ORDER BY id, yr, dt) nx_dt
from
#testtable
) sub
/*
drop table #testtable
create table #testtable
(
id int, yr int, dt date
)
insert into #testtable
(
id, yr, dt
)
SELECT 1111,2016,'2016-02-28' union all
SELECT 1111,2016,'2016-02-28' union all
SELECT 1111,2016,'2016-03-31' union all
SELECT 1111,2016,'2016-03-31' union all
SELECT 1111,2016,'2016-03-31' union all
SELECT 1111,2016,'2016-04-02' union all
SELECT 1111,2016,'2016-05-31' union all
SELECT 1111,2016,'2016-08-01' union all
SELECT 1111,2016,'2016-12-11' union all
SELECT 1111,2017,'2017-01-02' union all
SELECT 1111,2017,'2017-01-02' union all
SELECT 1111,2017,'2017-02-04' union all
SELECT 1111,2017,'2017-02-04' union all
SELECT 1111,2017,'2017-07-08' union all
SELECT 2222,2016,'2016-02-11' union all
SELECT 2222,2016,'2016-02-11' union all
SELECT 2222,2016,'2016-03-28' union all
SELECT 2222,2016,'2016-03-28' union all
SELECT 2222,2016,'2016-03-28' union all
SELECT 2222,2016,'2016-07-22' union all
SELECT 2222,2016,'2016-12-31' union all
SELECT 2222,2017,'2017-02-01' union all
SELECT 2222,2017,'2017-02-14'
*/
Run Code Online (Sandbox Code Playgroud)