如何在 PostgreSQL 中将条目时间戳分组到特定于访问者的 "sessions" 中?
How do I group entry timestamps into visitor-specific "sessions" in PostgreSQL?
这是一些模拟数据:
visitor_id,channel,timestamp,order_id,session
100,A,1,,1
100,B,2,,1
100,A,3,,1
100,B,4,1,1
100,B,5,,2
100,B,6,,2
100,B,7,2,2
100,A,8,,3
100,A,9,,3
访问者将通过渠道进入网站,并最终订购(创建 order_id)。许多访问者从不订购,但我仍然想将他们的会话分组在一起(例如,以确定他们的第一个频道是什么)。最后一栏是一个解决问题的例子。
在 PostgreSQL 中创建它的有效声明语句是什么?有没有比我提出的更好的解决方案?
您想将这些值合并到一个订单中。一种方法是为每一行分配一个分组 ID,例如给定时间之前的订单数。这可以通过相关子查询来完成:
select md.*,
(select count(md2.order_id)
from mockdata md2
where md2.visitor_id = md.visitor_id and
md2.timestamp < md.timestamp
) as session
from mockdata md;
这也可以使用累积计数来完成:
select md.*,
count(order_id) over (partition by visitor_id
order by timestamp
rows between unbounded preceding and 1 preceding
) as session
from mockdata md;
这是一些模拟数据:
visitor_id,channel,timestamp,order_id,session
100,A,1,,1
100,B,2,,1
100,A,3,,1
100,B,4,1,1
100,B,5,,2
100,B,6,,2
100,B,7,2,2
100,A,8,,3
100,A,9,,3
访问者将通过渠道进入网站,并最终订购(创建 order_id)。许多访问者从不订购,但我仍然想将他们的会话分组在一起(例如,以确定他们的第一个频道是什么)。最后一栏是一个解决问题的例子。
在 PostgreSQL 中创建它的有效声明语句是什么?有没有比我提出的更好的解决方案?
您想将这些值合并到一个订单中。一种方法是为每一行分配一个分组 ID,例如给定时间之前的订单数。这可以通过相关子查询来完成:
select md.*,
(select count(md2.order_id)
from mockdata md2
where md2.visitor_id = md.visitor_id and
md2.timestamp < md.timestamp
) as session
from mockdata md;
这也可以使用累积计数来完成:
select md.*,
count(order_id) over (partition by visitor_id
order by timestamp
rows between unbounded preceding and 1 preceding
) as session
from mockdata md;