我已经环顾了2天,却无法弄清楚这一点。使用下面的数据集和SQL Server 2016,我想按升序按“日期”按“ id”和“ cat”按顺序获得每行的行号,但如果序列中的值不同,则希望重新设置序列找到相同“ id”的“ cat”列(请参见绿色的行)。任何帮助将不胜感激。
答案 0 :(得分:2)
这是一个空白和孤岛的问题。在这种情况下,最简单的解决方案可能是行号有所不同:
select t.*,
row_number() over (partition by id, cat, seqnum - seqnum_c order by date) as row_num
from (select t.*,
row_number() over (partition by id order by date) as seqnum,
row_number() over (partition by id, cat order by date) as seqnum_c
from t
) t;
为什么这样做有效,所以很难解释。但是,如果您在子查询中查看序列号,就会发现差异定义了要定义的组。
注意:这假设date
列提供了稳定排序。您似乎在该列中有重复项。如果确实存在重复项,并且您没有用于排序的第二列,请尝试使用rank()
或dense_rank()
而不是row_number()
。