2016-10-28 80 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導致性能問題的事件。 從查詢中刪除此用戶。


稍後我會發送一個不涉及刪除用戶的解決方案。