为什么LAG函数的Last值没有产生任何值?

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

根据我的理解,我可以使用 LAG() 函数来访问上一行的值。我正在根据前一行的状态值创建新列“幸存”和“注销”。月份“2022-11”的状态为 1。由于它不为 NULL,我预计月份“2022-12”的行的幸存值为 1,并且 disnerrolled 为 0。但结果表将这些值视为 NA。这里发生了什么?为什么这些值没有显示?

 select * from tmp_enrollment_long_2;

person_id 状态
1234 2021-12 1
1234 2022-01 1
1234 2022-02 1
1234 2022-03 1
1234 2022-04 1
1234 2022-05 1
1234 2022-06 1
1234 2022-07 1
1234 2022-08 1
1234 2022-09 1
1234 2022-10 1
1234 2022-11 1
1234 2022-12 1
SELECT * 
,CAST( lag( status IS NOT NULL, 1 ) OVER( partition BY person_id ORDER BY month DESC ) AS SMALLINT ) AS survived
,CAST( lag( status IS     NULL, 1 ) OVER( partition BY person_id ORDER BY month DESC ) AS SMALLINT ) AS disenrolled
FROM tmp_enrollment_long_2;
person_id 状态 幸存下来 已注销
1234 2021-12 1 1 0
1234 2022-01 1 1 0
1234 2022-02 1 1 0
1234 2022-03 1 1 0
1234 2022-04 1 1 0
1234 2022-05 1 1 0
1234 2022-06 1 1 0
1234 2022-07 1 1 0
1234 2022-08 1 1 0
1234 2022-09 1 1 0
1234 2022-10 1 1 0
1234 2022-11 1 1 0
1234 2022-12 1
sql lag
1个回答
0
投票

使用“ORDER BY Month DESC”窗口的“上一行的状态值”实际上意味着“下个月的值”。在您的数据中,2022-12 是上个月,可用,没有下个月 - 因此值为空。

如果您需要一个非空值,您可以使用

coalesce
函数来获得一些合理的默认值:

coalesce(lag( status IS NOT NULL, 1 ), 1)
© www.soinside.com 2019 - 2024. All rights reserved.