根据当前行值使用滞后到 select 上一行
Use lag to select previous row based on current row value
我有一个table如下图
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
我想select数据基于Or operation
条规则
a) Select 所有记录 source_system = B
b) Select n 和 n-1 行,其中 r_diff = 0.
例如,在上面的数据中,您可以找到 r_diff = 0
行号 2,6,9
。所以,我想 select 行 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 table代表无序集合。您的问题假定在 table 中进行排序。 . .所以我必须假设有一列指定了顺序。
您可以使用 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)
我有一个table如下图
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
我想select数据基于Or operation
条规则
a) Select 所有记录 source_system = B
b) Select n 和 n-1 行,其中 r_diff = 0.
例如,在上面的数据中,您可以找到 r_diff = 0
行号 2,6,9
。所以,我想 select 行 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 table代表无序集合。您的问题假定在 table 中进行排序。 . .所以我必须假设有一列指定了顺序。
您可以使用 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)