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)
这是一个缺口和孤岛问题。这是使用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)
数量 | count_num --: | --------: 1 | 3 2 | 1 1 | 1 2 | 2 3 | 3
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |