Группа по периодам времени показывает только ненулевые итоги - PullRequest
1 голос
/ 21 апреля 2011

Я делаю MySQL запрос, чтобы подсчитать количество записей каждую минуту и ​​график результатов.Вывод результатов показывает только метки времени, где сумма не равна нулю.Это приводит к тому, что мой график дает неверные результаты, поскольку промежутки во времени рисуют линию между двумя точками.Я хотел бы возвращать каждую минуту и ​​количество значений.

Есть ли способ построить этот запрос без необходимости зацикливания и выполнения нескольких запросов?Или, если мне нужен цикл, есть ли простой способ проходить каждую минуту между двумя временными метками?

Это мой запрос:

SELECT UNIX_TIMESTAMP(timestamp) AS timestamp, count(*) AS total  
FROM table  
WHERE timestamp <= '2011-04-22 11:00' AND timestamp >= '2011-04-20 10:00'  
GROUP BY MINUTE(timestamp)

Ответы [ 2 ]

0 голосов
/ 21 апреля 2011
select i.`minute`,count(minute(timestamp)) as total from (
select tmp.digit + tmp2.digit * 10 as `minute`
from (
select 0 as digit union all 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5 union all 
select 6 union all 
select 7 union all 
select 8 union all 
select 9
) as tmp
cross join (
select 0 as digit union all 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5
) as tmp2 ) as i
left join table
on minute(tb.timestamp) = i.`minute`
and timestamp between '2011-04-20 10:00' and '2011-04-22 11:00' 
group by i.`minute`

Этот запрос даст вам 60 записей (минут от 0 до 59) с общим числом для каждой минуты без создания другой таблицы для хранения целочисленных значений.

0 голосов
/ 21 апреля 2011

То, что вы хотите сделать, это использовать таблицу «подсчет» или «цифры». По сути, вы создаете таблицу с одним целочисленным столбцом, в котором числа увеличиваются от 1 до очень большого числа. Таким образом, если в таблице подсчета есть 1000 записей, в таблице находятся числа от 1 до 1000. Вы захотите поместить в него больше цифр, чем 1000, но, надеюсь, вы поймете идею.

Как только вы получите таблицу подсчета (нажмите здесь для сценария), вы выберете ее в свой запрос, где numtablevalue находится в диапазоне от 1 до enddate - startdate (в минутах). А затем сгруппировать по startdate + numtablevalue.

Так что-то вроде этого (псевдо SQL) должно работать:

SELECT 'startdate' + INTERVAL tt.id MINUTE, COUNT(t1.timestampfield)
FROM tallytable AS tt
INNER JOIN
table AS t1
ON 'startdate' + INTERVAL tt.id MINUTE = t1.timestampfield
WHERE
tt.id BETWEEN 1 AND GETMINUTES('enddate' - 'begindate')
GROUP BY 'startdate' + INTERVAL tt.id MINUTE

Обычно мы выбираем числа от 1 до количества секунд между двумя датами. Затем мы используем startdate + tt.id, чтобы получить каждую секунду между датами. Затем мы присоединяемся и группируемся по этому, чтобы найти количество записей из t1, которые попадают в каждую минуту, как выбрано с использованием таблицы номеров. Я надеюсь, что это имеет смысл.

Есть несколько вещей, которые вы можете отметить:

  • Это получит времена> startdate (в отличие от> = startdate)
  • Будьте осторожны, если ваши временные метки имеют секунды, связанные с ними, поскольку 5:12 PM может не равняться 5:12:30 PM
...