我有一个如下所示的数据集:
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)。
答案 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来实现您要查找的值。