我有一张表如下
> 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。对不起。
答案 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'