【问题标题】:Counting consecutive values using partitioning - gaps and islands? [duplicate]使用分区计算连续值 - 间隙和孤岛? [复制]
【发布时间】:2022-01-11 06:22:30
【问题描述】:

我开始学习 row_number()over() 分区,我在这个网站上遇到了一个叫做间隙和岛屿的东西......我正在努力理解这一切。

我的数据表:

Step Number Status
1 Passed
2 Passed
3 Passed
4 Passed
5 Failed
6 Failed
7 Failed
8 Failed
9 Failed
10 Passed
11 Passed
12 Passed

我想要得到的结果:

Order Status Consecutive Counts
1 Passed 4
2 Failed 5
3 Passed 3

这是我所知道的。第一个“通过”没有出现在记录集中,我找不到在哪里放置 COUNT() 或任何函数来获取分区中的行数。

SELECT
    ROW_NUMBER() OVER(ORDER BY Status) AS 'Order', Status
FROM (
    SELECT *, Steppy = row_number() over (partition by [Status] order by [StepNumber] desc)
    FROM Q1
) A
GROUP BY Status

结果:

Order Status
1 Failed
2 Passed

【问题讨论】:

    标签: sql sql-server tsql window-functions


    【解决方案1】:

    以下给出了您想要的结果。

    使用您的步数,我们可以创建一个序列,您可以从中减去每个分区的行号以增加一个,然后您可以按该组聚合:

    with g as (
      select StepNumber, status, 
        Row_Number() over(order by StepNumber) 
        - Row_Number() over(partition by status order by StepNumber) grp
      from t
    )
    select Row_Number() over(order by grp) [Order],
    Status, Count(*) [consecutive counts]
    from g
    group by Status, grp
    

    【讨论】:

    • 请注意,这假设 StepNumber 将始终是增量的;如果它类似于IDENTITY,这是一个糟糕的假设。
    • 确实这是一个假设 - 使用单独的 row_number 很容易,我将修改查询。
    猜你喜欢
    • 2018-12-05
    • 2021-03-07
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2015-05-03
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多