oracle группировка таблиц по заказу - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть таблица oracle, где ref_id - это поле флага - это тип данных, а ORN - порядок данных в каждом ref_id:

ref_id   data    ORN   flag
  1       100     0     0
  1       200     1     0
  1       300     2     0
  1       400     3     0
  1       110     0     1
  1       210     1     1
  1       150     0     2
  1       250     1     2
  1       350     2     2
  1       450     3     2
  2       500     0     0
  2       600     1     0
  2       700     2     0
  2       800     3     0
  2       120     0     1
  2       220     1     1
  2       320     1     1
  2       420     1     1
  2       170     0     2
  2       270     1     2
  2       370     2     2
  2       470     3     2

Мне нужно сгруппировать данные следующим образом :

  • последние данные в флаге 0 с первыми данными в флаге 1
  • все данные в флаге 1 со следующими данными (количество данных в флаге 1 не является фиксированным)
  • последние данные в флаге 1 с первыми данными в флаге 2

, поэтому новая таблица будет выглядеть примерно так:

ref_id    data_1    data_2
  1        400       110
  1        110       210
  1        210       150
  2        800       120
  2        120       220
  2        220       320
  2        320       420
  2        420       170

любой намек, как это сделать sh это без использования петель?

1 Ответ

2 голосов
/ 03 апреля 2020

Вы можете использовать функции окна:

select ref_id, data data_1, lead_data data2
from (
    select
        t.*,
        lead(flag) over(partition by ref_id order by flag, orn) lead_flag,
        lead(data) over(partition by ref_id order by flag, orn) lead_data
    from mytable t
) t
where 
    flag = 0 and lead_flag = 1
    or (flag = 1 and lead_flag = 1)
    or (flag = 1 and lead_flag = 2)
order by ref_id, flag, orn

Демонстрация на DB Fiddle :

REF_ID | DATA_1 | DATA2
-----: | -----: | ----:
     1 |    400 |   110
     1 |    110 |   210
     1 |    210 |   150
     2 |    800 |   120
     2 |    120 |   220
     2 |    220 |   320
     2 |    320 |   420
     2 |    420 |   170

Обратите внимание, что для этого набора данных, предложение where можно упростить как:

where 1 in (flag, lead_flag)
...