我正在测试和比较各种形式的
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 中找到。