【发布时间】:2018-08-30 13:53:02
【问题描述】:
我已经四处寻找了 2 天,但无法弄清楚这一点。使用下面的数据集和 SQL Server 2016 我想按“id”和“cat”按“日期”按 asc 顺序获取每行的行号,但如果有不同的值,希望看到序列的重置找到相同“id”的“cat”列(见绿色行)。任何帮助将不胜感激。
【问题讨论】:
标签: sql sql-server
我已经四处寻找了 2 天,但无法弄清楚这一点。使用下面的数据集和 SQL Server 2016 我想按“id”和“cat”按“日期”按 asc 顺序获取每行的行号,但如果有不同的值,希望看到序列的重置找到相同“id”的“cat”列(见绿色行)。任何帮助将不胜感激。
【问题讨论】:
标签: sql sql-server
这是一个空白和孤岛问题。在这种情况下,最简单的解决方案可能是行号不同:
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()。
【讨论】: