【发布时间】:2012-06-09 14:12:39
【问题描述】:
我有一个类似这样的数据集:
X | U | datetime
-------------
1 | 1 | 1/1/12
1 | 2 | 1/1/12
1 | 2 | 1/1/12
1 | 2 | 1/1/12
1 | 4 | 1/1/12
2 | 2 | 2/1/12
2 | 3 | 2/1/12
1 | 3 | 3/1/12
2 | 4 | 3/1/12
3 | 2 | 4/1/12
这是访问日志。 X是访问的东西的id,U是用户id
我需要计算两个统计数据。
给定 X (x) 的值:
1) “新访问者”:统计第一次访问任意 X 到 x 的唯一用户数。
用例:
- 一个用户只访问过
x一次 -> 计为 1 - 一个用户只访问过
!x一次 -> 计为 0 - 一个用户只访问了两次
x-> 计为 1 - 一个用户只访问了两次
!x-> 计为 0 - 一个用户访问了很多个X,他们对任何X的第一次访问是
x-> 计为1 - 一个用户访问了很多个X,他们对任何X的第一次访问是
!x-> 计为0
以上数据示例:
X | Count
---------
1 | 3
2 | 1
3 | 0
2) “回访者”:计算访问过x 一次以上或访问过x 一次但之前访问过另一个X 的唯一用户数(即在他们单次访问@987654334 后进行的访问) @不算)
以上数据示例:
X | Count
---------
1 | 3
2 | 2
3 | 1
我正在使用 SQL Server 2008,非常感谢任何帮助。谢谢!
更新
这似乎回答了 Q1,虽然它不是很快:(
select x.X, COUNT(1)
from (
select t1.X
from @t t1
group by t1.X, t1.U
having (select COUNT (1) from @t t2 where t2.u= t1.U and t2.OccurredOn < MIN(t1.OccurredOn)) =0
) x
group by x.X
更新 2
我认为这是(2)
select t.X, COUNT(1)
from @t t
left join (
select t.U, MIN(t.OccurredOn) as O
from @t t
group by t.U
) x on t.U = x.U and t.OccurredOn <= x.O
where x.U is null
group by t.X
【问题讨论】:
标签: tsql aggregation