计数连续记录
我有一个表如下计数连续记录
> 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。对不起。
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'
我不认为这将符合要求 - 请参阅样本数据 – 2010-03-25 08:10:40
中的会话'm2jqyc45g'同意,我修正了它。它应该做他正在寻找的东西。 – 2010-03-25 14:47:38
不怕工作。最新的“1 = .....” – super9 2010-03-25 16:22:44
如何在地球上很好地将列对齐? – super9 2010-03-24 20:47:57
为什么计数是3?只有2个BuyNow的。 – DyingCactus 2010-03-24 21:04:08
您需要解释如何正确排序样本数据中的行 - 所有这些操作是否真的发生在同一秒? 另外,如果您确实期望3结果,您可能需要更清楚地定义“连续”的含义。 – 2010-03-25 08:37:05