计数连续记录

问题描述:

我有一个表如下计数连续记录

> 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 

如何编写一个查询,确实每当行现在购买,并点击OK已经在特定的会话连续记录计数? 例如,上面的数据集显示了网站上记录单独会话的2个用户。返回计应为3

我运行SQL Server 2008

编辑 只是为了澄清我的意思是由连续行什么,为什么计数应该返回3.在会议m2jqyc45g中,现在购买和点击确定在会话中连续发生,但是当它被输入到表中时,还有其他并发会话也会中断序列。如果您要通过SessionID然后按日期对结果集进行排序,您将依次获取它们。另外,RowID7有一个错字,ProductPage应该是BuyNow。对不起。

+0

如何在地球上很好地将列对齐? – super9 2010-03-24 20:47:57

+1

为什么计数是3?只有2个BuyNow的。 – DyingCactus 2010-03-24 21:04:08

+0

您需要解释如何正确排序样本数据中的行 - 所有这些操作是否真的发生在同一秒? 另外,如果您确实期望3结果,您可能需要更清楚地定义“连续”的含义。 – 2010-03-25 08:37:05

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上索引。

您的其他选项是使用公共表格表达式来获取按会话和时间分组的行ID。以下可能应该为你做。

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

我不认为这将符合要求 - 请参阅样本数据 – 2010-03-25 08:10:40

+0

中的会话'm2jqyc45g'同意,我修正了它。它应该做他正在寻找的东西。 – 2010-03-25 14:47:38

+0

不怕工作。最新的“1 = .....” – super9 2010-03-25 16:22:44