同様に次のようなデータセットがあります。
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