第一个ROW_NUMBER是按照ID排列的顺序,第二个是在同一个值里面(0或1)按照ID排序的顺序。如果0连续出现,这两个顺序之差就是一个固定的值,假如中间插入了1, 那么就会出现断层,一旦又连续了,这两个顺序之差又变成另一个固定的值。这个差值就可以作为我们分组的依据。
下面这个查询可以向你展示这个两个ROW_NUMBER及其差值是如何变化的:
WITH D AS (
SELECT 1 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 2 AS ID,1 AS VAL FROM DUAL
UNION ALL SELECT 3 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 4 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 5 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 6 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 7 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 8 AS ID,1 AS VAL FROM DUAL
UNION ALL SELECT 9 AS ID,1 AS VAL FROM DUAL
UNION ALL SELECT 10 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 11 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 12 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 13 AS ID,1 AS VAL FROM DUAL
UNION ALL SELECT 14 AS ID,1 AS VAL FROM DUAL
UNION ALL SELECT 15 AS ID,0 AS VAL FROM DUAL
UNION ALL SELECT 16 AS ID,0 AS VAL FROM DUAL
)
SELECT D.*
,ROW_NUMBER() OVER(ORDER BY ID) RN1
,DECODE(VAL,0,ROW_NUMBER() OVER(PARTITION BY VAL ORDER BY ID)) RN2
,ROW_NUMBER() OVER(ORDER BY ID)
-ROW_NUMBER() OVER(PARTITION BY VAL ORDER BY ID) GRP
FROM D;
ID VAL RN1 RN2 GRP
---------- ---------- ---------- ---------- ----------
1 0 1 1 0
2 1 2 1
3 0 3 2 1
4 0 4 3 1
5 0 5 4 1
6 0 6 5 1
7 0 7 6 1
8 1 8 6
9 1 9 6
10 0 10 7 3
11 0 11 8 3
12 0 12 9 3
13 1 13 9
14 1 14 9
15 0 15 10 5
16 0 16 11 5
16 rows selected.