是否有任何技术可以允许这样的行设置
WITH base AS ( SELECT 1 N FROM DUAL UNION ALL SELECT 2 N FROM DUAL UNION ALL SELECT 3 N FROM DUAL UNION ALL SELECT 6 N FROM DUAL UNION ALL SELECT 7 N FROM DUAL UNION ALL SELECT 17 N FROM DUAL UNION ALL SELECT 18 N FROM DUAL UNION ALL SELECT 19 N FROM DUAL UNION ALL SELECT 21 N FROM DUAL ) SELECT a.N FROM base a
产生结果
1 3 6 7 17 19 21 21
实际上,这是行到范围的操作。我正在Oracle Land上玩,并且希望您提出任何建议。
我觉得可能可以对此进行改进,但是它可以起作用:
WITH base AS ( SELECT 1 N FROM DUAL UNION ALL SELECT 2 N FROM DUAL UNION ALL SELECT 3 N FROM DUAL UNION ALL SELECT 6 N FROM DUAL UNION ALL SELECT 7 N FROM DUAL UNION ALL SELECT 17 N FROM DUAL UNION ALL SELECT 18 N FROM DUAL UNION ALL SELECT 19 N FROM DUAL UNION ALL SELECT 21 N FROM DUAL ) , lagged AS ( SELECT n, LAG(n) OVER (ORDER BY n) lag_n FROM base ) , groups AS ( SELECT n, row_number() OVER (ORDER BY n) groupnum FROM lagged WHERE lag_n IS NULL OR lag_n < n-1 ) , grouped AS ( SELECT n, (SELECT MAX(groupnum) FROM groups WHERE groups.n <= base.n ) groupnum FROM base ) SELECT groupnum, MIN(n), MAX(n) FROM grouped GROUP BY groupnum ORDER BY groupnum