Группа MySQL по датам между

Есть ли способ сгруппировать записи, попадающие между двумя датами?

Например, в моей таблице есть записи, которые выглядят так:

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

person Scooter5150    schedule 16.11.2011    source источник


Ответы (3)


Вы можете группировать практически все, что захотите. Если вы можете получить что-то в столбце, чтобы показать то, что вы хотите, вы можете сгруппировать его. Таким образом, всего за два периода вы можете просто сгруппировать по 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-месячных блоков, прошедших между вашей датой и начальным периодом в формате год-месяц.

person Inca    schedule 16.11.2011

В небольшом сочетании с другими ... вы можете расширить структуру корпуса для любого диапазона, который вы хотите. Группа по учитывает позицию «порядкового» столбца 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 
person DRapp    schedule 16.11.2011

Если бы была только одна группа, вы могли бы использовать «группу с условием наличия». Я не думаю, что есть синтаксис для указания нескольких разных групп в одном выражении и их разделения. Вот самое простое альтернативное решение, которое, как мне кажется, будет работать:

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';
person Ray    schedule 16.11.2011