如何相对于组中的值获得行号

Posted

技术标签:

【中文标题】如何相对于组中的值获得行号【英文标题】: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 第一次出现的值。

【问题讨论】:

【参考方案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

【讨论】:

我只是对问题稍作改动。 你应该问另一个问题。

以上是关于如何相对于组中的值获得行号的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:获取对应于组中其他列的最大值的列的值

相对于组内的整体变化创建滞后

如何管理相对于组的用户权限?

如何根据条件(组中的值)更新列?

excel公式问题,获取行号列号之后,如何获取该单元格内的值。

如何将文件中的不同行号存储到一个集合中?