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です。

2つの統計を計算する必要があります。

X(x)の値が与えられた場合:

1)「新規訪問者」:Xからへの最初の訪問を行ったユニークユーザーの数を数えますx

ユースケース:

  • ユーザーがx一度だけ訪問した->1としてカウント
  • ユーザーが!x一度だけアクセスした->0としてカウント
  • ユーザーは2回しか訪問していませんx->1としてカウントされます
  • ユーザーは2回しか訪問していません!x->0としてカウントされます
  • ユーザーが多くのXにアクセスしたことがあり、Xの最初のアクセスはx->1としてカウントされます。
  • ユーザーが多くのXにアクセスしたことがあり、Xの最初のアクセスは!x->0としてカウントされます。

上記のデータの例:

X | Count
---------
1 | 3
2 | 1
3 | 0

2)「リピーター」:2x回以上訪問した、または1回訪問しxたが、以前に別のXを訪問したユニークユーザーの数をカウントします(つまり、1回の訪問後に行われた訪問xはカウントされません)

上記のデータの例:

X | Count
---------
1 | 3
2 | 2
3 | 1 

私はSQLServer2008を使用していますが、どんな助けでも大歓迎です。ありがとう!

アップデート

これは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

<=編集:を単にに置き換えると結合が速くなることを除いて、2番目の解決策は問題ないと思います=

于 2012-06-05T15:15:54.227 に答える