查询事件在给定时间发生的频率

时间:2015-06-22 12:51:01

标签: mysql sql

[目的]
我们想知道一个事件" A"在时间之前出现" X"。更具体地说,考虑到下面的数据集,我们想要找出先前购买的数量。

[背景]
DMBS: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)]
- 如何在单个查询中执行此操作?

2 个答案:

答案 0 :(得分:1)

这可以使用用户定义的变量来完成,如前面的答案中已经提到的那样更快。 这需要根据某些顺序为每个组创建增量变量。从给定的数据集中userdate

在这里你如何实现它

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

答案 1 :(得分: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 ;

您也可以使用相关子查询执行此操作,但这可能更快。