如何使用与组中的值相关的行号

时间:2017-07-14 17:43:14

标签: sql postgresql amazon-redshift

我的数据如下:

Pagetype    member_id    created_at    rownum    
   A            2          date          1            
   B            2          date          2             
   C            2          date          3             
   D            4          date          1            
   B            4          date          2             
   R            4          date          3             
   B            13         date          1             
   S            13         date          2             
   B            13         date          3             

我想在下面添加另一栏:

Pagetype    member_id    created_at    rownum    DesiredRownum
   A            2          date          1            -1
   B            2          date          2             0
   C            2          date          3             1
   D            4          date          1            -1
   B            4          date          2             0
   R            4          date          3             1
   B            13         date          1             0
   S            13         date          2             1
   B            13         date          3             2

对于给定的DesiredColumn,只要PageType为B,我就想将值0分配给此member_id。对于任何PageType,在B之前member_id的任何值都应分配为负值,并且对于任何PageType,在B之后的任何member_id值应该被设为增加正值。

我用来获取数据的查询如下:

select pagetype,
member_id,
created_at,
row_number() over(partition by member_id order by created_at)
from table
order by member_id,
created_at

如何将此新列添加到我的数据中?

编辑:略有变化。 PageType可以为任何给定用户重复。例如,PageType B重复member_id 13.在这种情况下,我们希望计算第一次出现B时的值。

1 个答案:

答案 0 :(得分:3)

计算行号后,您可以获得" B"的值。并将其用于计算:

select t.*,
       (seqnum -
        max(case when pagetype = 'B' then seqnum end) over (partition by member_id)
       ) as b_diff
from (select pagetype, member_id, created_at,
             row_number() over (partition by member_id order by created_at) as seqnum
      from table
     ) t
order by member_id, created_at