2
我在PostgreSQL 9.5.2数据库上有一个表events
,其列id
,userid
和event_datetime
。我想为每个事件计算用户会话中以前事件的数量(最后三十分钟)。这是我想出了:如何获取点击之前的点击次数?
SELECT T1.id, COUNT(*) "cnt"
FROM events T1
INNER JOIN events T2
ON T1.userid = T2.userid
AND T1.event_datetime > T2.event_datetime -- T1 happened later than T2
AND T1.event_datetime - INTERVAL '30 MINUTES' < T2.event_datetime -- but not more than 30 minutes
GROUP BY T1.id;
然而,events
表是非常大的,而且上面的查询需要年龄。你有没有看到我如何优化这个方法?
编辑:我刚刚意识到,通过排除匿名用户我可以大大减少表的大小。这解决了我目前的问题。但仍然是一个有趣的问题。感谢您的评论!
OT,但我会做'GROUP BY T1.id'而不是GROUP BY 1. – jarlh
您是否在用户标识和event_datetime上编制索引?可能是一个复合指数是有用的 – scaisEdge
@jarlh我相信这是一个好点。你能解释一下为什么,你有一个关于“SQL的禅”的好读/链接? – asPlankBridge