Oracle:分析函数每次值更改后的总计

时间:2019-02-23 08:19:26

标签: sql oracle group-by gaps-and-islands subtotal

我有以下数据(如示例中的记录顺序):

A   B
1   10
1   20
1   30
1   40
2   50
2   65
2   75
1   89
1   100

从SQL:

with x as (
  select A, B
  from (
    select 1 as A, 10 as B from dual
    union all
    select 1 as A, 20 as B from dual
    union all
    select 1 as A, 30 as B from dual
    union all
    select 1 as A, 40 as B from dual
    union all
    select 2 as A, 50 as B from dual
    union all
    select 2 as A, 65 as B from dual
    union all
    select 2 as A, 75 as B from dual
    union all
    select 1 as A, 89 as B from dual
    union all
    select 1 as A, 100 as B from dual
  ) 
)
select A, B
from X

我想将A列中每次值更改的数据分组, 我想得到以下结果:

A   MIN(B)  MAX(B) 
1   10      40
2   50      75
1   89      100

如何在ORACLE 11中获得这样的结果。我希望实现一个简单的实现...

1 个答案:

答案 0 :(得分:3)

这是一个gaps and islands问题,使用row_number分析函数解决了

SELECT a,
       MIN(b),
       MAX(b)
FROM (
     SELECT x.*,
            ROW_NUMBER() OVER(
                 ORDER BY b
            ) - ROW_NUMBER() OVER(
                 PARTITION BY a
                 ORDER BY b
            ) AS seq
     FROM x
)
GROUP BY a,
         seq;  

Demo