SQL Server分区中的序列

时间:2018-08-30 13:53:02

标签: sql sql-server

我已经环顾了2天,却无法弄清楚这一点。使用下面的数据集和SQL Server 2016,我想按升序按“日期”按“ id”和“ cat”按顺序获得每行的行号,但如果序列中的值不同,则希望重新设置序列找到相同“ id”的“ cat”列(请参见绿色的行)。任何帮助将不胜感激。

sample data

1 个答案:

答案 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()