仅当满足条件时,lead()才能返回下一行吗?

时间:2020-10-05 17:52:09

标签: tsql sql-server-2016

最近我的公司从SQL Server 2008升级到2016,所以我想利用一些“新”功能,其中之一是lead()

我了解基本用法,但是我想知道是否只有在满足条件时才能返回下一行。我的原始查询如下所示,如果下一行距当前行不超过12天,则为x.next_id is null

SELECT 
    a.id, 
    a.date_a, 
    x.next_id
FROM 
    table a
OUTER APPLY
    (SELECT TOP 1 
         next_id = i.intIndex
     FROM 
         table i
     WHERE 
         i.date_a > DATEADD(DAY, 12, a.date_a)
     ORDER BY
         date_a, id ASC) x
ORDER BY
    date_a, id ASC

数据可能如下所示,其中第三列由查询添加:

id        date_a       next_id
--------------------------------
1798678   2014-12-01   NULL
1798689   2013-01-05   1798688
1798688   2014-03-31   NULL
1798696   2013-04-03   1798694
1798694   2013-08-12   1798691
1798691   2014-09-30   NULL
1798698   2013-05-14   1798697
1798697   2013-08-29   NULL

1 个答案:

答案 0 :(得分:1)

假设此数据集(您的结果表;减去结果列):

CREATE TABLE some_table(id INT PRIMARY KEY,date_a DATE);
INSERT INTO some_table(id,date_a)
VALUES (1798678,'2014-12-01'),
(1798689,'2013-01-05'),
(1798688,'2014-03-31'),
(1798696,'2013-04-03'),
(1798694,'2013-08-12'),
(1798691,'2014-09-30'),
(1798698,'2013-05-14'),
(1798697,'2013-08-29');

query返回的结果集与您所返回的查询相同:

SELECT
    id,
    date_a,
    next_id=
        CASE WHEN LEAD(date_a) OVER (ORDER BY date_a,id)>DATEADD(DAY,12,date_a)
            THEN LEAD(id) OVER (ORDER BY date_a,id)
            ELSE NULL
        END
FROM
    some_table
ORDER BY
    date_a,id;