MySQL Group по датам между - PullRequest
       3

MySQL Group по датам между

3 голосов
/ 16 ноября 2011

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

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

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

Ответы [ 3 ]

10 голосов
/ 16 ноября 2011

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

3 голосов
/ 16 ноября 2011

В небольшом сочетании других ... вы можете расширить структуру корпуса для любого диапазона, который вы хотите.Группировка по уважает позицию «порядкового» столбца 1, поэтому вам не нужно копировать одно и то же условие в предложении group 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 
0 голосов
/ 16 ноября 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';
...