Увеличить значение столбца при определенном условии в SQL-запросе на Postgresql - PullRequest
0 голосов
/ 11 июня 2018

Я хочу объединить свои прогулки с животными по неделям, группируя мои ряды в 1 группе, если перерыв между неделями был больше 2 недель.

У меня есть таблица:

Create table test.walk (animal text, week integer)

со строкойдля каждой прогулки я хочу сгруппировать:

insert into test.walk values ('DOG', 2)
insert into test.walk values ('DOG', 3)
insert into test.walk values ('DOG', 4)
insert into test.walk values ('CAT', 1)
insert into test.walk values ('CAT', 1)
insert into test.walk values ('CAT', 11)
insert into test.walk values ('CAT', 12)
insert into test.walk values ('CAT', 13)

Я борюсь с оконными функциями dens_rank () и lag (), но не получаю дополнительный столбец, в котором я должен получить 3 различных значения.

Вот мой желаемый результат:

enter image description here

Какую комбинацию оконных функций я должен использовать, чтобы получить два WALK_NO для CAT?(потому что после недели 1 кот ждал меня дольше 2 недель)

1 Ответ

0 голосов
/ 11 июня 2018

Использование lag() и совокупная сумма:

with query as (
select w.*,
       sum(case when week < prev_week + 2 then 0 else 1 end) over (partition by animal order by week) as grp
from (select w.*,
             lag(week) over (partition by animal order by week) as prev_week
      from test.walk w
     ) w
)
select
    animal, week, grp,
    dense_rank() over (order by animal, grp) as grp2
from query

Query output

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

select w.*,
       sum(case when prev_week = week then 0 else 1 end) over (order by min_week, animal, week) as grp
from (select w.*,
             lag(week) over (partition by animal order by week) as prev_week,
             min(week) over (partition by animal) as min_week
      from test.walk w
     ) w;
...