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