2010-03-24 5 views
2

У меня есть таблица следующимCount для последовательных записей

> 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 и щелкнул OK были записаны последовательно в той или иной сессии? Например, в приведенном выше наборе данных показано, как 2 пользователя на сайте записывают отдельные сеансы. Количество возврата должно быть 3.

Я бегу SQL Server 2008

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

+0

Как я могу выровнять столбцы с заголовками ??? – super9

+1

Зачем нужен счет? Есть только 2 BuyNow. – DyingCactus

+0

вам нужно объяснить, как правильно упорядочить строки в ваших данных образца - все эти действия действительно происходят в одну секунду? Кроме того, вам может потребоваться более четко определить, что вы подразумеваете под «последовательно», если вы действительно ожидаете 3 в результате. –

ответ

3
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' 
+0

Я не думаю, что это будет соответствовать требованию - см. сеанс 'm2jqyc45g' в данных выборки –

+0

Согласен, я исправил его. Он должен делать именно то, что он ищет сейчас. –

+0

не работает. что с «1 = .....» – super9

Смежные вопросы