Посчитайте для последовательных записей - PullRequest
2 голосов
/ 24 марта 2010

У меня есть следующая таблица

> RowID   SessionID       EventID  RequestedURL   Date
> 1       m2jqyc45g       1        Start          24/03/2010 19:52
> 2       m2jqyc45g       1        ProductPage    24/03/2010 19:52
> 3       m2jqyc45g       28       BuyNow         24/03/2010 19:52
> 4       tjmvb55dc4dg    1        ProductPage    24/03/2010 19:52
> 5       tjmvb55dc4dg    1        BuyNow         24/03/2010 19:56
> 6       tjmvb55dc4dg    1        Clicked OK     24/03/2010 19:56
> 7       m2jqyc45g       1        Clicked OK     24/03/2010 19:56
> 8       tjmvb55dc4dg    28       Help           24/03/2010 19:56
> 9       m2jqyc45g       1        Home           24/03/2010 19:56
> 6       m2jqyc45g       1        ProductPage    24/03/2010 19:56
> 7       tjmvb55dc4dg    1        BuyNow         24/03/2010 19:56
> 8       tjmvb55dc4dg    28       Clicked OK     24/03/2010 19:56
> 9       tjmvb55dc4dg    1        Home           24/03/2010 19:56

Как мне написать запрос, который подсчитывает каждый раз, когда строки BuyNow и Clicked OK записываются последовательно в определенном сеансе?Например, набор данных выше показывает, что 2 пользователя на сайте записывают отдельные сеансы.Возвращаемое количество должно быть 3.

Я использую SQL Server 2008

РЕДАКТИРОВАТЬ Просто чтобы уточнить, что я имею в виду под последовательными строками и почему счет должен возвращать 3.В сеансе m2jqyc45g BuyNow и Clicked Ok происходят последовательно в течение сеанса, но когда он входит в таблицу, существуют и другие параллельные сеансы, которые нарушают последовательность.Если вы должны были упорядочить набор результатов по SessionID, а затем по дате, вы получите их один за другим.Также была опечатка с RowID7, ProductPage должен быть BuyNow.Извините за это.

1 Ответ

3 голосов
/ 24 марта 2010
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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...