我的問題的基本要點是,對於每個事件A,我需要找到與同一用戶關聯的最早的以下事件B.目前,我有:在SQL中高效地查找下一個事件
SELECT e.UserID, e.date, min(e2.date)
FROM Event e INNER JOIN
Event e2 ON e.UserID = e2.UserID AND e.date <= e2.date
WHERE e.Event LIKE 'A' AND e2.Event LIKE 'B'
然而,對於每一個事件A(它可以發生於用戶的任何次數),衆多的事件B的發生,所以內連接的創建無數額外行,這則有在min函數上除掉。有沒有更高效/更快的方式來做到這一點?
(服務器是MSSQL Server 2008中)
UPDATE: 難道更快以秩()?
Select UserID, date, date2
from (
Select e.UserID, e.date, e2.date as date2, rank() OVER (PARTITION BY e.date, e.UserID ORDER BY e2.date) as rank
FROM Event e INNER JOIN Event e2 on e.UserID = e2.UserID
WHERE e.Event = 'A' and e2.Event = 'B' and e.date <= e2.date
)
WHERE rank = 1
或者將優化帶出來基本相等?
使用'min'似乎對我很好。然而,有沒有一個原因是你使用'LIKE'而不是'='。這就是真正的業績下滑的地方。 –
你不需要在那裏有一個「GROUP BY」嗎? –
Jacob:我對SQL有點新,所以like和=有什麼不同呢? – Jodaka