根据当前行值使用滞后到 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)