問題:表含 fphm(年份)、kshm(流水號) 兩欄,流水號可能連續、可能斷點。需查詢出連續區間的起訖號碼。
fphm kshm
2014 00000001
2014 00000002
2014 00000003
2014 00000004
2014 00000005
2014 00000007 -- 斷點
2014 00000008
2014 00000009
2013 00000120
2013 00000121
2013 00000122
2013 00000124 -- 斷點
2013 00000125
fphm start_hm end_hm
2014 00000001 00000005
2014 00000007 00000009
2013 00000120 00000122
2013 00000124 00000125
SELECT b.fphm, MIN(b.kshm) Start_HM, MAX(b.kshm) End_HM
FROM (
SELECT a.*, TO_NUMBER(a.kshm - ROWNUM) cc
FROM (
SELECT * FROM t ORDER BY fphm, kshm
) a
) b
GROUP BY b.fphm, b.cc
fphm, kshm 排序後,ROWNUM 為 1,2,3... 遞增。kshm 與 ROWNUM 同步遞增 1,差值 kshm - ROWNUM 保持常數。kshm 跳躍大於 1,差值發生變化,自然分組。fphm + 差值 cc 分組,取 MIN/MAX 即得區間起訖。此技巧廣泛適用於連續日期、流水號、ID 區間查詢,屬 SQL 進階分組技法經典範例。