如何比较同一个表中的多行并用不同的值标记它们?
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 完美地满足了我的需要。我以后一定会用的!以上是关于如何比较同一个表中的多行并用不同的值标记它们?的主要内容,如果未能解决你的问题,请参考以下文章