Использование оконной функции в красном смещении для условного агрегирования - PullRequest
1 голос
/ 17 февраля 2020

У меня есть таблица со следующими данными: input data

Ссылка на данные испытаний: http://sqlfiddle.com/#! 15 / dce01 / 1/0

Я хочу агрегировать столбец items (используя listagg) для каждой группы в gid в последовательности, как указано в столбце seq, исходя из условия, что агрегация заканчивается, когда pid снова становится 0 для группы.

то есть для группы g1 было бы 2 агрегации; 1 для последовательности 1-3 и другой для последовательности 4-6; поскольку для группы g1 pid становится 0 для seq 4.

Я ожидаю, что результат для данного примера будет следующим ( Обратите внимание, что seq в результате является минимальным значением seq для группа, в которой pid становится 0 ): result

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Я понимаю ваш вопрос как проблему пробелов и островков, когда вы хотите сгруппировать смежные строки, имеющие одинаковые gid до pid значения 0.

Вот один способ решить это с помощью суммы окна для определения групп: в основном, новый остров запускается каждый раз, когда встречается pid 0. Остальное просто агрегация:

select
    gid,
    min(seq) seq,
    listagg(items, ',') within group(order by seq) items
from (
    select 
        t.*,
        sum(case when pid = 0 then 1 else 0 end) over(partition by gid order by seq) grp
    from mytable t
) t
group by gid, grp
order by gid, grp
1 голос
/ 17 февраля 2020

проблема пробелов и островков:

with
 subgroup_ids as (
    select *, sum(case when pid=0 then 1 else 0 end) over (partition by gid order by seq) as subgroup_id
    from tablename
)
select gid, subgroup_id, listagg(items,',')
from subgroup_ids
group by 1,2
...