本文介紹了如何在SQL中按連續記錄分組的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我的表中有這些記錄
ID Colour
------------
1 Red
2 Red
3 Red
4 Red
5 Red
6 Green
7 Green
8 Green
9 Green
10 Red
11 Red
12 Red
13 Red
14 Green
15 Green
16 Green
17 Blue
18 Blue
19 Red
20 Blue
我可以像這樣輕松地按顏色分組
SELECT Colour, MIN(ID) AS iMin, MAX(ID) AS iMax
FROM MyTable
GROUP BY Colour
這將返回此結果
Colour iMin iMax
-------------------------
Red 1 19
Green 6 16
Blue 17 20
但這不是我想要的,因為紅色不會一直從1到19,綠色打破了順序。
結果應該是這樣的
Colour iMin iMax
------------------------
Red 1 5
Green 6 9
Red 10 13
Green 14 16
Blue 17 18
Red 19 19
Blue 20 20
我設法通過游標做到了這一點,但我想知道有沒有更有效的方法
推薦答案
這是一個缺口和孤島問題。假設id
不斷遞增,您可以使用row_number()
之間的差異來定義具有相同colour
的”相鄰”記錄組:
select
colour,
min(id) iMin,
max(id) iMax
from (
select t.*, row_number() over(partition by colour order by id) rn
from mytable t
) t
group by colour, id - rn
order by min(id)
Demo on DB Fiddle:
colour | iMin | iMax :----- | ---: | ---: Red | 1 | 5 Green | 6 | 9 Red | 10 | 13 Green | 14 | 16 Blue | 17 | 18 Red | 19 | 19 Blue | 20 | 20
這篇關于如何在SQL中按連續記錄分組的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,