MySQL: группа по дате - PullRequest
       13

MySQL: группа по дате

1 голос
/ 04 июня 2009

ОК. У меня есть запрос, который довольно хорошо группирует 2 столбца:

SELECT search_query_keyword, search_query_date, COUNT(1) as count
            FROM search_queries 
            WHERE search_query_date >= '.$from.' AND search_query_date <= '.$to.'
            GROUP BY search_query_keyword, search_query_date
            ORDER BY count DESC
            LIMIT 10

Но что, если я хочу сгруппировать по дате ДИАПАЗОН, а не просто по дате? Есть ли способ сделать это?

Спасибо!

РЕДАКТИРОВАТЬ: ОК, эти ответы довольно сложные, и я думаю, что я хочу, может быть достигнуто гораздо проще, поэтому позвольте мне объяснить заново. Например, я хочу выбрать ключевые слова за период времени "> = 20090601 AND <= 20090604". Но вместо того, чтобы получать повторяющиеся ключевые слова, я бы предпочел просто получить унцию ключевого слова и сколько раз это происходило. Например, вместо этого: </p>

keyword: foo
keyword: foo
keyword: foo
keyword: bar
keyword: bar

Я бы получил:

keyword: foo, count: 3
keyword: bar, count: 2

Ответы [ 3 ]

3 голосов
/ 04 июня 2009

Я не совсем уверен насчет группировки диапазонов дат - вам нужно определить желаемый диапазон дат, а затем, возможно, вы сможете объединить эти запросы:

SELECT 
    'Range 1' AS 'date_range',
    search_query_keyword
FROM search_queries
WHERE search_query_date >= '.$fromRange1.' AND search_query_date <= '.$toRange1.'
UNION
SELECT 
    'Range 2' AS 'date_range',
    search_query_keyword
FROM search_queries
WHERE search_query_date >= '.$fromRange2.' AND search_query_date <= '.$toRange2.'
GROUP BY 1,2

Или, если вы хотите поместить их в группу из числа дней, например «30 дней, 60 дней и т. Д.», Вы можете сделать это:

SELECT 
    (DATEDIFF(search_query_date, NOW()) / 30) AS date_group,
    search_query_keyword
FROM search_queries
GROUP BY date_group, search_query_keyword

РЕДАКТИРОВАТЬ: На основе дополнительной информации, которую вы предоставили, этот запрос должен дать то, что вы хотите:

SELECT 
    search_query_keyword,
    COUNT(search_query_keyword) AS keyword_count
FROM search_queries
WHERE search_query_date >= '.$from.' AND search_query_date <= '.$to.'
GROUP BY search_query_keyword
2 голосов
/ 04 июня 2009

Вы можете группировать по оператору CASE или по результату функции. Например:

SELECT search_query_keyword, QUARTER(search_query_date), COUNT(1) as count
FROM search_queries 
WHERE search_query_date >= '.$from.' AND search_query_date <= '.$to.'
GROUP BY search_query_keyword, QUARTER(search_query_date)
ORDER BY count DESC
0 голосов
/ 04 июня 2009

просмотр различных функций на основе DATE и сборка на их основе, например

select  YEAR( of your date ) + MONTH( of your date ) as ByYrMonth

но результат в вышеприведенном случае необходимо будет преобразовать в символ, чтобы предотвратить 2009 год + январь (месяц 1) = 2010, также ошибочно сгруппированный с 2008 + февраль (месяц 2) = 2010 и т. Д ... Ваш строка должна выглядеть примерно так:

...
200811
200812
200901
200902
200903
...

Если вы хотите по календарным кварталам, вам нужно будет сделать целое число (месяц -1), деленное на 4, так что ...

Jan (-1) = 0 / 4 = 0
Feb (-1) = 1 / 4 = 0
Mar (-1) = 2 / 4 = 0
Apr (-1) = 3 / 4 = 0
May (-1) = 4 / 4 = 1
June (-1)= 5 / 4 = 1 ... etc...

Да, предыдущий пример явно ссылается на функцию QUARTER (), которая обрабатывает более красиво, но если вы делаете это также на основе старения, например, 30, 60, 90 дней, вы можете применить вышеописанную математику, но разделить ее на 30 группы.

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