2016-10-28 47 views
2

我在PostgreSQL 9.5.2数据库上有一个表events,其列id,useridevent_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表是非常大的,而且上面的查询需要年龄。你有没有看到我如何优化这个方法?

编辑:我刚刚意识到,通过排除匿名用户我可以大大减少表的大小。这解决了我目前的问题。但仍然是一个有趣的问题。感谢您的评论!

+0

OT,但我会做'GROUP BY T1.id'而不是GROUP BY 1. – jarlh

+0

您是否在用户标识和event_datetime上编制索引?可能是一个复合指数是有用的 – scaisEdge

+0

@jarlh我相信这是一个好点。你能解释一下为什么,你有一个关于“SQL的禅”的好读/链接? – asPlankBridge

回答

1

有偏见的用户有150 K导致性能问题的事件。 从查询中删除此用户。


稍后我会发送一个不涉及删除用户的解决方案。