如何在 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;