Sql 如何比较同一表中的多行并使用不同的值标记它们?
所以我的问题似乎很容易解决,但很快就会变得复杂。我希望能够比较每个任务ID的序列号,并根据它们是否连续而对它们进行不同的标记。我有一张这样的桌子: 任务id 序号 阶段 4444444 7. 检查 4444444 8. 检查 4444444 9 检查 4444444 10 检查 4444444 53 检查 4444444 54 检查 4444444 55 检查 4444444 91 检查 4444444 92 检查Sql 如何比较同一表中的多行并使用不同的值标记它们?,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,所以我的问题似乎很容易解决,但很快就会变得复杂。我希望能够比较每个任务ID的序列号,并根据它们是否连续而对它们进行不同的标记。我有一张这样的桌子: 任务id 序号 阶段 4444444 7. 检查 4444444 8. 检查 4444444 9 检查 4444444 10 检查 4444444 53 检查 4444444 54 检查 4444444 55 检查 4444444 91 检查 4444444 92 检查 您可以从seq_num中减去顺序值。当值递增1时,该值为常量 然后,使用dens
您可以从
seq_num
中减去顺序值。当值递增1时,该值为常量
然后,使用densite\u 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
请分享你的想法非常感谢你,戈登!稠密的队伍完美地满足了我的需要。我一定会在将来使用它!