2015-06-22 3 views
0

[Aim]
Мы хотели бы узнать, как часто это событие «А» ocurred до того времени «X». Более конкретно, учитывая приведенный ниже набор данных, мы хотим узнать количество предыдущих покупок.запросов, как часто происходит событие в данный момент времени

[Контекст]
СУБД: MySQL 5.6
Мы следующий набор данных:

user | date    
1 | 2015-06-01 17:00:00 
2 | 2015-06-02 18:00:00 
1 | 2015-06-03 19:00:00 


[Желаемая выход]

user | date     | purchase count 
1 | 2015-06-01 17:00:00 | 1 
2 | 2015-06-02 18:00:00 | 1 
1 | 2015-06-03 19:00:00 | 2 


[Уже пытался]
Нам удалось получить счет в определенный день, используя внутреннее соединение на самой таблице.

[Проблема (s)]
- Как сделать это в одном запросе?

ответ

1

Это может быть сделано с использованием пользовательской переменной, которая быстрее, как уже упоминалось в предыдущем ответе. Это требует создания инкрементной переменной для каждой группы в зависимости от некоторого упорядочения. И из данных данных установите его user и date.

Вот как вы можете достичь его

select 
user, 
date, 
purchase_count 
from (
    select *, 
    @rn:= if(@prev_user=user,@rn+1,1) as purchase_count, 
    @prev_user:=user 
    from test,(select @rn:=0,@prev_user:=null)x 
    order by user,date 
)x 
order by date; 

Изменить имя таблицы test для вашего фактического имени таблицы

http://sqlfiddle.com/#!9/32232/12

0

Вероятно, наиболее эффективным способом является использование переменных:

select t.*, 
     (@rn := if(@u = user, @rn + 1, 
        if(@u := user, 1, 1) 
       ) 
     ) as purchase_count; 
from table t cross join 
    (select @rn := 0, @u := '') params 
order by user, date ; 

Вы также можете сделать это с коррелированных подзапросов, но это, вероятно, быстрее.

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