计算连续记录

时间:2010-03-24 20:30:45

标签: sql-server tsql sql-server-2008

我有一张表如下

> 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 个答案:

答案 0 :(得分: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进行索引。

您的另一个选择是使用公用表表达式来获取按会话和时间分组的行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'