2016-12-20 3 views
1

Мне нужны результаты моих отслеживаемых платежей, где я могу видеть, сколько из каждого варианта оплаты использовалось за 15 минут в течение последних пяти часов.Запрос MySQL для сгруппированных данных через 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; 

Проблема заключается в том, что я не получаю результаты для сгруппированных timeperiods даже с временами, как 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

Вопрос: Где будет '12: 07' падение? Будет ли он классифицироваться под '12: 00' или под' 12: 15'? –

+0

Все значения UNTIL 12:15 должны попадать в интервал 12:15. – naptoon

ответ

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, в зависимости от того, что вы ожидаете.

+0

К сожалению, это не желаемый результат :( – naptoon

+0

@naptoon Я забыл указать все нужные вам столбцы. Для этого вы можете присоединиться к моей первой попытке вернуться к исходной таблице. –

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 

Примечание: Это хорошая идея, ваша таблица должна содержать первичный индекс для каждой строки, а также. Я сделал это, чтобы работать только с полями, которые вы упомянули выше.

Одно из предостережений заключается в том, что это будет использовать каждую дату/время, содержащиеся в вашем столе. Если вы хотите только сегодняшние результаты, нам придется дополнительно группировать по дате или указывать дату в предложении WHERE.

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