Как я могу использовать оконную функцию - сложный случай в PostgreSQL
У меня есть таблица, как показано ниже:
group sequence action
1 1 promotion_1
1 2 promotion_1
1 3 promotion_2
1 4 act1
1 5 act1
1 6 act2
1 7 promotion_1
1 8 act1
1 9 act2
1 10 promotion_1
1 11 act1
2 1 promotion_2
2 2 act1
Я хотел бы создать рейтинг, который покажет диапазон продвижения. Поэтому мне нужно иметь одинаковый номер для продвижения и каждого действия после этой акции:
group sequence action parameter
1 1 promotion_1 1
1 2 promotion_1 2
1 3 promotion_2 3
1 4 act1 3
1 5 act1 3
1 6 act2 3
1 7 promotion_1 4
1 8 act1 4
1 9 act2 4
1 10 promotion_1 5
1 11 act1 5
2 1 promotion_2 1
2 2 act1 1
Я читал об оконных функциях и их возможностях (например, over()), но я могу создать только ранжирование с группой по "действию".
2 ответа
select T.*,
sum(case when action like 'promotion%' then 1 else 0 end)
over(partition by "group" order by sequence rows unbounded preceding) parameter
from Table T
filter
(Начиная с PostgeSQL 9.4)
select *
,count (*) filter (where action like 'promotion%') over
(
partition by "group"
order by sequence
rows unbounded preceding
)
from mytable T
+-------+----------+-------------+-------+
| group | sequence | action | count |
+-------+----------+-------------+-------+
| 1 | 1 | promotion_1 | 1 |
| 1 | 2 | promotion_1 | 2 |
| 1 | 3 | promotion_2 | 3 |
| 1 | 4 | act1 | 3 |
| 1 | 5 | act1 | 3 |
| 1 | 6 | act2 | 3 |
| 1 | 7 | promotion_1 | 4 |
| 1 | 8 | act1 | 4 |
| 1 | 9 | act2 | 4 |
| 1 | 10 | promotion_1 | 5 |
| 1 | 11 | act1 | 5 |
| 2 | 1 | promotion_2 | 1 |
| 2 | 2 | act1 | 1 |
+-------+----------+-------------+-------+