Совокупные числа в последовательности - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть таблица part_tab с колонкой serial_no:

PART_NO     SERIAL_NO
   A            1
   A            2
   A            3
   A            5
   A            7
   A            8
   A            9
   A            10

Я хотел бы объединить serial_no значений в одну строку, когда они в последовательности:

PART_NO     SERIAL_NO
   A            1-3
   A            5
   A            7-10

Группировка по part_no. Поэтому для детали № «А» я бы хотел выбрать serial_no в одном столбце со значениями «1-3», «5», «7-10». Выбранный столбец должен находиться в диапазоне от минимума до максимума и в порядке возрастания.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Это проблема пробелов и островков, к которой вы можете обратиться, оцифровав свои ряды и вычтя эти числа из серийных номеров.Это дает вам группы, которые вам нужны.

select
  part_no,
  case when min(serial_no) = max(serial_no)
    then to_char(min(serial_no))
    else min(serial_no) || '-' || max(serial_no)
  end as serial_nos
from
(
  select
    part_no,
    serial_no,
    serial_no - row_number() over (partition by part_no order by serial_no) as grp
  from mytable
)
group by part_no, grp
order by part_no, min(serial_no);
0 голосов
/ 13 ноября 2018

Вы можете сделать это без pl / sql, используя запрос с некоторыми распространенными табличными выражениями (предложение with).Это выглядело бы так:

with add_break as (
    select part_no, 
           serial_no,
           serial_no-1-lag(serial_no,1,0) over (partition by part_no order by serial_no) brk
    from part_tab
),
add_group as (
    select add_break.*, 
           sum(brk) over (partition by part_no order by serial_no) as grp
    from   add_break
)
select part_no,
       case when min(serial_no) = max(serial_no) then to_char(min(serial_no))
            else to_char(min(serial_no)) || '-' || to_char(max(serial_no))
       end range
from   add_group
group by part_no, grp
order by 1, 2

Вывод данных для вашего примера:

part_no | range
--------+------
   A    | 1-3
   A    | 5
   A    | 7-10
...