SELECT COUNT(*)
FROM yourTable y
WHERE RequestedURL = 'BuyNow'
AND Exists (SELECT *
FROM yourTable x
WHERE x.RowID = (SELECT MIN(RowID)
FROM yourTable z
WHERE z.SessionID = y.SessionID
AND z.RowID > y.RowID)
AND RequestedURL = 'Clicked')
Это должно сделать это. Там может быть более быстрый путь, но я не уверен, что еще вы можете сделать. Кроме того, вы, вероятно, захотите, но индексы для RowID и SessionID.
Другим вариантом является использование общих табличных выражений для получения идентификаторов строк, сгруппированных по сеансу и времени. Ниже может сделать это для вас.
WITH temp AS (
SELECT
SessionID,
RequestedURL,
[Date],
RN = ROW_NUMBER() OVER (ORDER BY SessionID,[Date])
FROM yourTable
ORDER BY SessionID,[Date])
SELECT
COUNT(*)
FROM temp x
JOIN temp y ON x.SessionID = y.SessionID
AND x.RN = y.RN - 1
WHERE x.RequestedURL = 'BuyNow'
AND y.RequestedURL = 'Clicked'