如何比较同一个表中的多行并用不同的值标记它们?

Posted

技术标签:

【中文标题】如何比较同一个表中的多行并用不同的值标记它们?【英文标题】:How do I compare multiple rows in the same table and tag them with different values? 【发布时间】:2021-05-04 20:27:55 【问题描述】:

所以我的问题似乎很容易解决,但很快就会变得复杂。我希望能够比较每个任务 ID 的序列号,并根据它们是否连续对它们进行不同的标记。我有一张这样的桌子:

task_id seq_num phase
4444444 7 Check
4444444 8 Check
4444444 9 Check
4444444 10 Check
4444444 53 Check
4444444 54 Check
4444444 55 Check
4444444 91 Check
4444444 92 Check

我需要的输出是:

task_id seq_num phase grouping
4444444 7 Check Check 1
4444444 8 Check Check 1
4444444 9 Check Check 1
4444444 10 Check Check 1
4444444 53 Check Check 2
4444444 54 Check Check 2
4444444 55 Check Check 2
4444444 91 Check Check 3
4444444 92 Check Check 3

我正在搞乱 lag() 和 load() 但我遇到了一些麻烦。任何人都可以帮助指导我正确的方向吗?

谢谢!

【问题讨论】:

请分享您的尝试 【参考方案1】:

您可以从seq_num 中减去一个连续值。这是常数,当值递增 1 时。

然后,使用dense_rank() 分配一个分组:

select t.*,
       dense_rank() over (partition by task_id order by seq_num - x) as grouping
from (select t.*,
             row_number() over (partition by task_id order by seq_num) as x
      from t
     ) t;

另一种方法是使用lag() 和累积和:

select t.*,
       sum(case when prev_seqnum = seqnum - 1 then 0 else 1 end) over (partition by task_id order by seq_num) as grouping
from (select t.*,
             lag(seq_num) over (partition by task_id order by seq_num) as prev_seqnum
      from t
     ) t

【讨论】:

非常感谢戈登! dense_rank 完美地满足了我的需要。我以后一定会用的!

以上是关于如何比较同一个表中的多行并用不同的值标记它们?的主要内容,如果未能解决你的问题,请参考以下文章

比较数组中的值计算它们并合并表中的行

如何从具有相同 id 的多行中选择仅一行的值并用 - 分隔它们? [复制]

您如何比较多个表中的记录但查找不同或缺失的值

比较 2 个表中的值并生成具有差异的新表

比较两个表中的值并计算它们的差异

MySQL - 比较 Ajax 数组中的值,如果不在表中,则删除它们