我需要跟踪付款的结果,我可以看到在过去五个小时内每隔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.
答案 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
替换为FLOOR
或CEIL
,具体取决于您的期望。
答案 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子句中指定日期。