PostgreSQL

时间:2016-12-02 21:51:13

标签: sql postgresql amazon-redshift

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

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。在这种情况下,第一次访问应被视为第0次访问(newrownum列中的值为0)。

3 个答案:

答案 0 :(得分:3)

这是一种方法:

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;

换句话说,这会计算&#39; blah&#39;的行号。使用另一个窗口功能。在更新版本的Postgres中,您可以使用filter关键字而不是case语句作为条件分钟。

注意:由于'blah',这与第一次出现的min()相比有所偏差。最后一次使用max()。而且,您的实际逻辑可能使用类似url like '%blah'的内容或具有完整路径名的内容。

答案 1 :(得分: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 ~ '.+/blah$'

答案 2 :(得分:1)

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