Основная суть моей проблемы заключается в том, что для каждого события A мне нужно найти самое раннее следующее событие B, связанное с тем же пользователем. В настоящее время у меня есть:
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:
Будет ли это быстрее с Rank ()?
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
Или оптимизация выведет их к практически эквивалентным?