我有一个类似这样的数据集:
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
x
2)“回访者”:计算访问过一次以上或访问过一次但之前访问过另一个 X的唯一用户数x
(即单次访问后的访问x
不计算在内)
以上数据的例子:
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