【问题标题】:Use lag to select previous row based on current row value使用滞后根据当前行值选择上一行
【发布时间】:2021-09-04 21:32:19
【问题描述】:

我有一张如下图所示的表格

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) 选择 n 和 n-1 行,其中 r_diff = 0。

例如,在上面的数据中,您可以找到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 postgresql group-by window-functions


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多