首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 查詢連續號碼段巧解:ROWNUM 差值分組法實戰範例

     編輯:關於SqlServer

問題:表含 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

精妙解法:Oracle 分析函數 + ROWNUM 差值不變性

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 進階分組技法經典範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved