【问题标题】:Relative row_number() in PostgreSQLPostgreSQL 中的相对 row_number()
【发布时间】:2016-12-02 21:51:12
【问题描述】:

我有一个如下所示的数据集:

SessionID    URL              created    rownum
abc   www.google.com/page1    2016-08-01   1
abc   www.google.com/page2    2016-08-02   2
abc   www.google.com/blah     2016-08-03   3
abc   www.google.com/page3    2016-08-04   4
abc   www.google.com/page4    2016-08-05   5

我想要一个如下所示的输出:

SessionID    URL               created   rownum  newrownum
abc   www.google.com/page1    2016-08-01   1    -2
abc   www.google.com/page2    2016-08-02   2    -1
abc   www.google.com/blah     2016-08-03   3    0
abc   www.google.com/page3    2016-08-04   4    1
abc   www.google.com/page4    2016-08-05   5    2

换句话说,我想查看session 访问特定页面blah 的位置,并且我想查看在此特定页面之前和之后访问的页面。请注意,session 中的页面是按照 created 字段排序的。

我使用以下查询生成了rownum 列:

select 
    sessionid, 
    url, 
    created,
    row_number() over(partition by sessionid order by created) as rownum
from 
    <tablename>
order by 
    sessionid, 
    created

我不确定如何获取对于某个页面为负值的行号。这是必需的,因此我可以绘制在页面blah 之前和之后访问的页面类型。当然,同一会话中可以有多次访问同一页面blah。在这种情况下,应将第一次访问视为第零次访问(newrownum 列中的值为 0)。

【问题讨论】:

    标签: sql postgresql amazon-redshift


    【解决方案1】:

    这是一种方法:

    select sessionid, url, created, rownum,
           (rownum - min(case when url = 'blah' then rownum end) over (partition by sessionid) as newrownum
    from (select sessionid, url, created,
                 row_number() over (partition by sessionid order by created) as rownum
          from <tablename>
         ) t
    order by sessionid, created;
    

    换句话说,这使用另一个窗口函数计算“blah”的行号。在更新的 Postgres 版本中,您可以使用 filter 关键字而不是 case 语句作为条件最小值。

    注意:由于min(),这会从第一次出现'blah' 开始偏移。最后一次出现将使用max()。而且,您的实际逻辑可能使用 url like '%blah' 之类的东西或带有完整路径名的东西。

    【讨论】:

    • 非常感谢您的简单回答,这很有意义。工作就像一个魅力:)。
    【解决方案2】:

    您可以从每个会话的已计算的 rownum 列中减去 blah 的 rownum。

    select t.*, rownum-max(case when url like '%blah%' then rownum end) over(partition by sessionid) newrownum
    from (
    select 
        sessionid, 
        url, 
        created,
        row_number() over(partition by sessionid order by created) as rownum
    from 
        <tablename>
    ) t
    order by rownum
    

    要获得包含 blah 的 url 的精确模式匹配,请使用正则表达式,例如 url ~ '.+/blah$'

    【讨论】:

      【解决方案3】:

      根据您要用作基线的页面的行号(您的第 0 行)应用偏移量。在这种情况下,您可以创建一个新字段作为 rownum - 3 来实现您正在寻找的值。

      【讨论】:

        猜你喜欢
        • 2016-05-09
        • 2018-11-16
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        • 2022-01-11
        相关资源
        最近更新 更多