2012-06-05 3 views
0

У меня есть набор данных, который аналогично выглядит следующим образом:агрегация комплекс SQL

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 является идентификатором вещи, которую посетил, и U является идентификатором пользователя

Мне нужно вычислить две статистики.

Учитывая значение для Й (х):

1) «новые посетители»: Подсчитайте количество уникальных пользователей, которые сделали свой первый визит для любого X в x.

случаи использования:

  • Пользователь только посетили x один раз -> засчитывается как 1
  • Пользователь только посетили !x раз -> считается как 0
  • Пользователь только посетил x дважды -> учитывается как 1
  • Пользователь только заходил !x дважды -> 0
  • Пользователь посетил много Xs, где их первый vi сидеть любой X является x -> засчитывается как 1
  • пользователь посетил многие крестики, где их первый визит любого X является !x -> считается как 0

приведенными выше примерами данных:

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

2) «возвращающиеся посетители»: подсчитайте количество уникальных пользователей, которые посетили x более одного раза или посетили x один раз, но посетили другой Х ранее (т.е. посещения, сделанные после их одного посещения x не рассчитывайте)

примеры из выше данных:

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

Я использую SQL Server 2008, любая помощь очень ценится. Благодаря!

Update

Это, как представляется, ответ 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 

Update 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 

ответ

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 

Edit: Я думаю, что ваше решение второй нормально, за исключением того, что присоединиться будет быстрее, если вы замените <= с просто =.

+0

Это не правильно, на всех :( –

+0

Извините, я случайно забыл другие части соединения для первого. Должен работать. – thyme

+0

Да, я заметил, что и добавил их, это все еще не правильно. которые ранее посещают другой X –

Смежные вопросы