根据我的理解,我可以使用 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 |
使用“ORDER BY Month DESC”窗口的“上一行的状态值”实际上意味着“下个月的值”。在您的数据中,2022-12 是上个月,可用,没有下个月 - 因此值为空。
如果您需要一个非空值,您可以使用
coalesce
函数来获得一些合理的默认值:
coalesce(lag( status IS NOT NULL, 1 ), 1)