这是 LEAD() IGNORE NULLS 的错误吗?

问题描述 投票:0回答:1

我正在测试和比较各种形式的

LAST()
LEAD()
FIRST_VALUE()
LAST_VALUE()
窗口函数,似乎发现了
LEAD() IGNORE NULLS
的错误。

它似乎返回了与

LAG() IGNORE NULLS
相同的值,而不是预期的结果。我希望它返回的结果与
FIRST_VALUE(Value) IGNORE NULLS OVER(ORDER BY Id ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)

相同

我认为这是一个错误是否正确,或者我错过了什么?如果出现错误,报告它的最佳位置是什么?

-- With nulls
CREATE TABLE T (Id INT IDENTITY(1,1), Value INT)
INSERT T
VALUES
    (NULL), (11), (22), (33),
    (NULL), (44), (55), (66),
    (NULL), (77), (88), (99),
    (NULL)

SELECT *
    , LAG(Value) OVER(ORDER BY Id) AS Lag
    , LAG(Value) IGNORE NULLS OVER(ORDER BY Id) AS LagI
    , LEAD(Value) OVER(ORDER BY Id) AS Lead
    , LEAD(Value) IGNORE NULLS OVER(ORDER BY Id) AS [LeadI ???]
    , FIRST_VALUE(Value) IGNORE NULLS
          OVER(
              ORDER BY Id
              ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING -- Strictly following
          )
          AS [FirstISF (= expected LeadI)]
FROM T
ORDER BY T.Id

结果:

身份证 价值 滞后 滞后我 领导我??? FirstISF(= 预期 LeadI)
1 11 11
2 11 22 22
3 22 11 11 33 11 33
4 33 22 22 22 44
5 33 33 44 33 44
6 44 33 55 33 55
7 55 44 44 66 44 66
8 66 55 55 55 77
9 66 66 77 66 77
10 77 66 88 66 88
11 88 77 77 99 77 99
12 99 88 88 88
13 99 99 99

上述查询(以及其他一些查询)可在 this db<>fiddle 中找到。

sql-server window-functions lead sql-server-2022
1个回答
0
投票

这是一个错误 - 但看起来现在已被修复(大概是 CU4 中的 2278800

DB Fiddle 上,对于以下查询,它只有一种排序

SELECT  LAG(Value) IGNORE NULLS OVER(ORDER BY Id) AS LagI,
        LEAD(Value) IGNORE NULLS OVER(ORDER BY Id) AS [LeadI ???]
FROM T
ORDER BY T.Id

在 CU 8(返回正确结果)中,执行计划分别计算两个窗口函数,并且计划宽度是原来的两倍

© www.soinside.com 2019 - 2024. All rights reserved.