Oracle: аналитические функции Подытоги после каждого изменения значения - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть следующие данные (порядок записей, как в примере):

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 голосов
/ 23 февраля 2019

Это проблема пробелов и островков , решаемая с помощью аналитической функции 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;  

Демо

...