MySQL以15分钟为间隔查询分组数据

时间:2016-12-20 14:08:49

标签: mysql group-by intervals

我需要跟踪付款的结果,我可以看到在过去五个小时内每隔15分钟使用了多少付款选项。

我的表" payment_options_log"有两列:payment_option和created_on。 我的第一种方法是像stckoverflow中描述的另一个主题那样做:

SELECT MAX(created_on) max_timestamp, payment_option, count(payment_option)
FROM   payment_options_log
WHERE ...
GROUP  BY DATE(created_on), HOUR(created_on), MINUTE(created_on) DIV 15, payment_option;

问题是我没有得到分组时间段的结果,甚至有时间,如12:00,12:15,12:30等。

有没有人为我的问题提供另一种解决方案?结果应如下所示:

time   payment_option   count
12:00  CreditCard       20
12:00  PayPal           25
12:15  CreditCard       21
12:15  PayPal           19
etc.

2 个答案:

答案 0 :(得分:0)

SELECT t1.created_on,
       t2.quarterPeriod,
       t1.payment_option,
       t2.payment_count
FROM payment_options_log t1
INNER JOIN
(
    SELECT ROUND(UNIX_TIMESTAMP(created_on)/(15 * 60)) AS quarterPeriod,
           COUNT(*) AS payment_count
    FROM payment_options_log
    GROUP BY ROUND(UNIX_TIMESTAMP(created_on)/(15 * 60))
) t2
    ON ROUND(UNIX_TIMESTAMP(t1.created_on)/(15 * 60)) = t2.quarterPeriod

此查询会将12:07视为属于12:15存储桶,这可能不是您想要的。您可以将ROUND替换为FLOORCEIL,具体取决于您的期望。

答案 1 :(得分:0)

这应该可以解决问题:

Select CONCAT(HOUR(created_on),':', LPAD(MINUTE(created_on) DIV 15 * 15, 2, 0), date_format(created_on, '%p')) as Time, payment_option, count(payment_option) 
from 
payment_options_log 
group by Time, payment_option 
order by Time, payment_option

注意:您的表格应该包含每行的PRIMARY索引,这是一个好主意。我这样做只适用于你上面提到的字段。

这里需要注意的是,这将使用表格中包含的每个日期/时间。如果您只想获得今天的结果,我们必须进一步按日期分组或在WHERE子句中指定日期。