Oracle - Convert value from rows into ranges

前端 未结 3 1637
攒了一身酷
攒了一身酷 2021-01-06 06:23

Are there any techniques that would allow a row set like this

WITH 
base AS
(
    SELECT  1 N FROM DUAL UNION ALL
    SELECT  2 N FROM DUAL UNION ALL
    SEL         


        
3条回答
  •  日久生厌
    2021-01-06 06:39

    I feel like this can probably be improved on, but it works:

    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
    

提交回复
热议问题