Есть ли способ сгруппировать записи, попадающие между двумя датами?
Например, в моей таблице есть записи, которые выглядят так:
rid stamp uid
25 2005-07-05 14:10:29 25
1175 2005-08-12 15:47:35 29
290 2005-11-22 16:38:53 42
30 2005-12-01 10:48:12 47
30 2006-01-02 17:34:28 52
30 2006-02-06 22:11:35 57
30 2006-04-17 15:10:19 59
1195 2006-05-08 21:55:56 62
100 2006-06-30 15:51:04 94
45 2006-07-03 21:14:37 24
Я пытаюсь написать запрос, который вернет количество записей между месяцами February - August и между September - January по годам, так что я получаю следующее:
July 2005 - January 2006: 3
February 2006 - August 2006: 5
Ответ 1 · рейтинг 10 · Inca
Вы можете группировать практически все, что захотите. Если вы можете получить что-то в столбце, чтобы показать то, что вы хотите, вы можете сгруппировать его. Таким образом, всего за два периода вы можете просто сгруппировать по if:
SELECT * FROM table
GROUP BY if(stamp between "2005-07-01" and "2006-02-01", 0, 1)
Если вам нужно, чтобы периоды варьировались в течение более длительного времени (несколько лет), вы можете использовать period_diff для различения:
SELECT * FROM table
GROUP BY floor(period_diff( DATE_FORMAT(stamp, "%Y%m"), "200507") / 6)
Это даст вам количество 6-месячных блоков, прошедших между вашей датой и начальным периодом в формате год-месяц.
Ответ 2 · рейтинг 3 · DRapp
В небольшом сочетании с другими ... вы можете расширить структуру корпуса для любого диапазона, который вы хотите. Группа по учитывает позицию "порядкового" столбца 1, поэтому вам не нужно копировать одно и то же условие случая в предложении группы по. Кроме того, я добавил Order by, чтобы иметь тот же контекст случая, поскольку в противном случае он упорядочивал бы результаты в алфавитном порядке. Вы можете упорядочить все, что захотите... даже в обратном порядке, если вы хотите, чтобы самая текущая активность была указана первой.
SELECT
case when stamp between "2005-07-01" and "2006-02-01"
then "July 2005 - January 2006 "
when stamp between "2006-02-01" and "2006-08-01"
then "February 2006 - August 2006"
else "After August 2006 "
end as GroupColumn,
count(*) as TotalPerGroup
from
table
where
date >= '2005-07-01'
group by
1
order by
case when stamp between "2005-07-01" and "2006-02-01"
then 1
when stamp between "2006-02-01" and "2006-08-01"
then 2
else 3
end
Ответ 3 · Ray
Если бы была только одна группа, вы могли бы использовать "группу с условием наличия". Я не думаю, что есть синтаксис для указания нескольких разных групп в одном выражении и их разделения. Вот самое простое альтернативное решение, которое, как мне кажется, будет работать:
select "July 2005 - January 2006" AS "Date", count(date) as "results"
from MYTABLE
where date >= '2005-07-01' AND date <= '2006-01-31'
union
select "February 2006 - August 2006" AS "Date", count(date) as "results"
from MYTABLE
where date >= '2006-02-01' AND date <= '2006-08-31';