需求:表含 fphm (發票號碼)、kshm (起始號碼),第二欄可能連續、可能斷點。要查出每個連續區間的起止號。
利用 ROW_NUMBER() 生成遞增序號,連續號碼段中「號碼值 - 序號」保持常數。按此常數分組,取 MIN/MAX 即得區間。
SELECT fphm, MIN(kshm) AS start_hm, MAX(kshm) AS end_hm
FROM (
SELECT fphm, kshm,
ROW_NUMBER() OVER (PARTITION BY fphm ORDER BY kshm) AS rn
FROM t
) a
GROUP BY fphm, (kshm - rn);
結果:2014, 00000001, 000000052014, 00000007, 000000092013, 00000120, 000001222013, 00000124, 00000125
單掃描、無游標、無自聯結,極其高效優雅。