如何使用滞后功能跳过一行? PostgreSQL 9.3
Posted
技术标签:
【中文标题】如何使用滞后功能跳过一行? PostgreSQL 9.3【英文标题】:How do I use lag function to skip a row? PostgreSQL 9.3 【发布时间】:2018-01-05 02:46:33 【问题描述】:我目前正在尝试从列出用户冲浪行为的表中编写查询。该表如下所示
**RecordID RespondentID DeviceID UTCTimestamp Domain**
1 01faca75-1216-4a55-b43c-9d64ade852f7 4DF57C06-F0BD-4779-8983-37A8B02E5EDF 2017 年 6 月 11 日 10:21 goodreads.com
2 01faca75-1216-4a55-b43c-9d64ade852f7 4DF57C06-F0BD-4779-8983-37A8B02E5EDF 2017 年 6 月 11 日 10:21 goodreads.com
3 01faca75-1216-4a55-b43c-9d64ade852f7 4DF57C06-F0BD-4779-8983-37A8B02E5EDF 2017 年 6 月 11 日 10:21 gr-assets.com
4 01faca75-1216-4a55-b43c-9d64ade852f7 4DF57C06-F0BD-4779-8983-37A8B02E5EDF 06/11/2017 10:21 gr-assets.com
5 01faca75-1216-4a55-b43c-9d64ade852f7 4DF57C06-F0BD-4779-8983-37A8B02E5EDF 06/11/2017 10:23 itunes.apple.com
6 01faca75-1216-4a55-b43c-9d64ade852f7 4DF57C06-F0BD-4779-8983-37A8B02E5EDF 06/11/2017 10:23 itunes.apple.com
7 01faca75-1216-4a55-b43c-9d64ade852f7 4DF57C06-F0BD-4779-8983-37A8B02E5EDF 2017 年 6 月 11 日 10:51
8 01faca75-1216-4a55-b43c-9d64ade852f7 4DF57C06-F0BD-4779-8983-37A8B02E5EDF 2017 年 6 月 11 日 10:51
感谢大家的帮助,我终于搞定了。
RecordID RespondentID UTCTimestamp Source Domain To Domain RecordID
2 01faca75-1216-4a55-b43c-9d64ade852f7 06/11/2017 10:21 goodreads.com gr-assets.com 3 4 01faca75-1216-4a55-b43c-9d64ade852f7 2017 年 6 月 11 日 10:21 gr-assets.com itunes.apple.com 5 6 01faca75-1216-4a55-b43c-9d64ade852f7 06/11/2017 10:23 itunes.apple.com samplicio.us 7To Domain 是域名不同的下一行的值。
问题 虽然这看起来是正确的,但我们实际上已经跳过了整个第一条记录。这是因为,给定数据集,第一行“域”连接到第二行“域”,我们跳过了它。第 2 行与第 3 行相结合,因此第一个结果记录显示 RecordID 2。我想进一步微调。我的结果应该从 RecordID 1 开始并跳过 RecordID 2,因为域是相同的,因此结果应该显示
RecordID RespondentID UTCTimestamp 源域到域
1 01faca75-1216-4a55-b43c-9d64ade852f7 06/11/2017 10:21 goodreads.com gr-assets.com 3 01faca75-1216-4a55-b43c-9d64ade852f7 2017 年 6 月 11 日 10:21 gr-assets.com itunes.apple.com 5 01faca75-1216-4a55-b43c-9d64ade852f7 06/11/2017 10:23 itunes.apple.com samplicio.us我尝试跳过 RecordID 2,但是遇到了 SQL 错误“prev_nane”不存在。
SELECT t1."RecordID", t1."RespondentID", t1."UTCTimestamp", t1."Domain" as "Source Domain", t2."Domain" as "To Domain" , t2."RecordID", lag(t1."Domain",1) over (order by t1."RecordID") as prev_name
from public."Traffic - Mobile" as t1
join public."Traffic - Mobile" as t2 on t2."RespondentID" = t1."RespondentID" AND t2."DeviceID"=t1."DeviceID" AND t2."RecordID"=t1."RecordID"+1 And t1."Domain"<>T2."Domain" AND t2."UTCTimestamp">=t1."UTCTimestamp" AND t2."Sequence"-t1."Sequence"=1 and t1."RecordID"<13 AND t1."Domain"<>prev_name;
我做错了什么?
我想要达到的最终结果如下 RecordID RespondentID UTCTimestamp 源域到域最终目的地
1 01faca75-1216-4a55-b43c-9d64ade852f7 06/11/2017 10:21 goodreads.com gr-assets.com samplicio.us 3 01faca75-1216-4a55-b43c-9d64ade852f7 06/11/2017 10:21 gr-assets.com itunes.apple.com samplicio.us 5 01faca75-1216-4a55-b43c-9d64ade852f7 06/11/2017 10:23 itunes.apple.com samplicio.us samplicio.us名为“最终目的地”的附加列。这是为了让我将 3 笔交易组合在一起,作为到达 samplicio.us 的路径。
提前致谢。
【问题讨论】:
如果recordid 2和record 3上的时间戳是10:22,record 4上的时间是10:23,那么预期的结果会改变吗?我想弄清楚什么时候“跳过”一条记录? 看看***.com/questions/18290572/… 是的,我也注意到了。所以我的跳过将是这个。如果记录 1 显示域 A,记录 2 显示域 A,记录 3 显示域 B,结果将显示 From Source, Domain A 到 Source Domain B。我想要做的是捕捉有人进入站点的那一刻,然后移动到另一个站点。目前他们在网站内做什么并不重要。 用户是否由 RespondentID 和 DeviceID 识别? ID 系统是否生成唯一标识符,可以用来判断每个用户哪个是较早的记录? 是的,用户由 RespondentID 和 DeviceID 标识。时间戳由捕获此运动的系统生成。一些动作更长,即,我们可以看到几秒钟或几分钟,但它们现在是根据顺序排序的。同一受访者可以拥有不同的设备,他们在这些设备上的移动被视为不同的用户。 【参考方案1】:试试这个:
with t1 as
(
select
recordid,
respondentid,
deviceid,
utctimestamp,
domain,
row_number() over (partition by
respondentid,
deviceid
order by
utctimestamp,
recordid) as user_seq,
row_number() over (partition by
respondentid,
deviceid,
domain
order by
utctimestamp,
recordid) as user_domain_seq
from traffic_mobile)
select *
from
(
select
recordid,
respondentid,
deviceid,
utctimestamp,
domain,
lead(domain) over ( partition by
respondentid,
deviceid order by
user_seq) as next_domain,
last_value(domain) over( partition by
respondentid,
deviceid order by user_seq
rows between unbounded preceding
and unbounded following )
as final_domain
from t1
where
user_domain_seq = 1 ) t2
where t2.next_domain is not null
sqlfiddle:sqlfiddle.com/#!17/dc248/3
PS。对于在 traffic_mobile 表上只有 1 个条目的用户,查询不会返回一行。如果需要,则需要改进查询以包含它们。
【讨论】:
让我试试这个并提供更新。提前致谢。以上是关于如何使用滞后功能跳过一行? PostgreSQL 9.3的主要内容,如果未能解决你的问题,请参考以下文章