【问题标题】:How to have row numbers with respect to a value in a group如何相对于组中的值获得行号
【发布时间】:2017-07-14 17:43:14
【问题描述】:

我的数据如下:

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

每当PageType 是给定member_id 的B 时,我想将值0 分配给这个DesiredColumn。对于任何 member_id,在 B 之前的任何 PageType 值都应分配为负值,对于任何 member_id,在 B 之后的任何 PageType 值都应分配为递增的正值。

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

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 第一次出现的值。

【问题讨论】:

    标签: sql postgresql amazon-redshift


    【解决方案1】:

    计算行号后,您可以得到“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
    

    【讨论】:

    • 我只是对问题稍作改动。
    • 你应该问另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2011-11-03
    • 2019-10-17
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多