Как я могу использовать оконную функцию - сложный случай в 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 |
+-------+----------+-------------+-------+
Другие вопросы по тегам