如何按顺序对相同的值进行分组

Din*_*aud 0 sql t-sql sql-server window-functions gaps-and-islands

我正在尝试按顺序对数据进行分组。我有下表:

id  num
-------
1   1
2   1
3   1
4   2
5   1
6   2
7   2
8   4
9   4
10  4
Run Code Online (Sandbox Code Playgroud)

我需要 SQL 查询来输出以下内容:

num       count(num)
-------------------    
1          3    
2          1    
1          1    
2          2    
4          3 
Run Code Online (Sandbox Code Playgroud)

样本数据:

select * into #temp 
from (
    select 1 as id, 1 as num union all
    select 2,  1  union all
    select 3,  1  union all
    select 4,  2  union all
    select 5,  1  union all
    select 6,  2  union all
    select 7,  2  union all
    select 8,  4  union all
    select 9,  4  union all
    select 10, 4 
) as abc
select * from #temp
Run Code Online (Sandbox Code Playgroud)

select num, count(num) from #temp group by num

我需要这个 :

num       count(num)    
-------------------    
1          3    
2          1    
1          1    
2          2    
4          3 
Run Code Online (Sandbox Code Playgroud)

实际输出:

num    count(num)    
---------------------    
1       4    
2       3    
4       3
Run Code Online (Sandbox Code Playgroud)

GMB*_*GMB 5

这是一个缺口和孤岛问题。这是使用lag()和累积解决它的一种方法sum()

select
    min(num) num,
    count(*) count_num
from (
    select
        t.*,
        sum(case when num = lag_num then 0 else 1 end) over(order by id) grp
    from (
        select 
            t.*,
            lag(num) over(order by id) lag_num
        from #temp t
    ) t
) t
group by grp
Run Code Online (Sandbox Code Playgroud)

DB Faddlde 上的演示

数量 | count_num
--: | --------:
  1 | 3
  2 | 1
  1 | 1
  2 | 2
  3 | 3