GROUP BY с диапазоном дат - PullRequest
       13

GROUP BY с диапазоном дат

2 голосов
/ 17 февраля 2011

У меня есть таблица с 4 столбцами, id, Stream, которая является текстом, Duration (int) и Timestamp (datetime).В каждый раз, когда кто-то воспроизводит определенный аудиопоток на моем сайте, вставляется строка.Stream - это имя, а Duration - это время в секундах, которое они слушают.В настоящее время я использую следующий запрос для определения общего количества часов прослушивания для каждой недели в году:

SELECT YEARWEEK(`Timestamp`), (SUM(`Duration`)/60/60) FROM logs_main
WHERE `Stream`="asdf" GROUP BY YEARWEEK(`Timestamp`);

Это соответствует ожиданиям ... представляет общее время прослушивания для каждой недели в годуесть данные.

Тем не менее, я хотел бы создать запрос, в котором в течение нескольких недель у меня будет строка результатов, в которой не может быть никаких данных.Например, если на 26-й неделе 2006 года нет строк, попадающих в эту неделю, то я бы хотел, чтобы результат SUM был равен 0.

Возможно ли это сделать?Может быть через JOIN как-то в диапазоне дат?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Испытанное настоящее решение старой школы состоит в том, чтобы создать другую таблицу с набором диапазонов дат, с которыми вы можете внешне объединиться для группировки (как в другой таблице будут все недели с началом / концом). Дата).

В этом случае вы можете просто обойтись таблицей, полной значений из YEARWEEK:

201100
201101
201102
201103
201104

А вот эскиз SQL-заявления:

SELECT year_weeks.yearweek , (SUM(`Duration`)/60/60) 

FROM year_weeks LEFT OUTER JOIN logs_main
   ON year_weeks.yearweek = logs_main.YEARWEEK(`Timestamp`)

WHERE `Stream`="asdf" GROUP BY year_weeks.yearweek;
0 голосов
/ 17 февраля 2011

Вот предложение. может быть не совсем то, что вы ищете.

Но скажем, у вас была простая таблица с одним столбцом [year_week], которая содержала значения 1, 2, 3, 4 ... 52

Тогда вы могли бы теоретически:

SELECT

A.year_week, 
(SELECT SUM('Duration')/60/00) FROM logs_main WHERE
 stream = 'asdf' AND YEARWEEK('TimeStamp') = A.year_week GROUP BY YEARWEEK('TimeStamp')) 

FROM

tblYearWeeks A 

это, очевидно, нуждается в доработке ... Я сделал несколько похожих запросов в других проектах, и это работает достаточно хорошо в зависимости от ситуации.

Если вы ищете решение на основе одной таблицы / sql, то это, безусловно, то, что меня также заинтересовало бы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...