sql - 使用滞后根据当前行值选择上一行
问题描述
我有一个如下所示的表格
person_id source_system r_diff
1 A NULL
1 B 0
1 B 9
1 A 15
1 A 574
1 B 0
1 A 63
1 A 136
1 B 0
我想根据Or operation
2 条规则选择数据
a) 选择所有记录source_system = B
b) 选择 r_diff = 0 的 n 和 n-1 行。
例如,在上面的数据中,您可以找到r_diff = 0
行号2,6,9
。所以,我想选择第 1,2 和 5,6 和 8,9 行。你可以看到我是如何选择 n 和 n-1 行的
我尝试了以下
select *, lag(*) from table A
where (r_diff is NULL or r_diff = 0) or source_system in ('B')
我希望我的输出如下所示
person_id source_system r_diff
1 A NULL
1 B 0
1 B 9
1 A 574
1 B 0
1 A 136
1 B 0
解决方案
SQL 表表示无序集。您的问题假定表中的排序。. . 所以我必须假设有一列指定排序。
您可以使用lead()
子查询来处理此问题:
select t.*
from (select t.*,
lead(r_dif) over (partition by person_id order by <ordering column<>) as next_r_dif
from t
) t
where 0 in (next_r_dif, r_dif)
推荐阅读
- python - 无法使用 Python django 在 HTML 网页中查看 PPT
- python - 如何使 cv2.VideoWriter 更轻
- emv - 确定 EMV 卡的发行人
- python - 在 Python 中使用 break 命令时出错
- python - EC2 实例上的 Django + PostgreSQL 备份和恢复
- javascript - 如何根据javascript中的条件订购安排?
- regex - 如何将正则表达式缩写引入 Lex 中的正则表达式?
- python - 我使用 Python 制作了一个非常基本的脚本(我是新手),但我不知道为什么它不能正常工作
- python - 如何基于ids python有效地连接来自不同csv文件的列
- python - scikit learn 与 np.polyfit 的多项式回归