【问题标题】:Sequence within a partition in SQL serverSQL Server 分区内的序列
【发布时间】:2018-08-30 13:53:02
【问题描述】:

我已经四处寻找了 2 天,但无法弄清楚这一点。使用下面的数据集和 SQL Server 2016 我想按“id”和“cat”按“日期”按 asc 顺序获取每行的行号,但如果有不同的值,希望看到序列的重置找到相同“id”的“cat”列(见绿色行)。任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是一个空白和孤岛问题。在这种情况下,最简单的解决方案可能是行号不同:

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

    【讨论】:

    • 谢谢戈登!它工作得很好。感谢您的帮助。
    • 作为对“为什么这样有效”的一点尝试,我倾向于将其视为“如果你有两个连续的序列以相同的速率增加,它们之间的差异对于同一组中的项目将是相同的,并且会在边界处发生变化。
    • @BenThul 。 . .我有时是这样解释的。我仍然认为,仅仅看到结果是说服人们更快的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多