0

我有一个类似这样的数据集:

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

x2)“回访者”:计算访问过一次以上或访问过一次但之前访问过另一个 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
4

1 回答 1

1

对于第一种情况,您需要一个子查询来加入,这将过滤掉所有不是第一次的用户访问。所以你会有类似的东西

select X, count(*) [First Visits]
from table t1
     join (select U, min(datetime) firstvisit 
           from table 
           group by U) t2 on t1.datetime = t2.firstvisit and t1.U = t2.U
group by X

<=编辑:我认为你对第二个的解决方案很好,除了如果你用简单的替换加入会更快=

于 2012-06-05T15:15:54.227 回答