Как сгруппировать количество строк в день также в дни без рядков в MySQL? - PullRequest
2 голосов
/ 29 февраля 2012

Итак, у меня есть этот стол. У этого есть несколько сотен рядов. В каждой строке есть поле даты и времени. И что мне нужно сделать, это получить количество строк за определенный период времени, но не за весь период, а за каждый день этого периода. До этого момента я знаю, что делать. Но более того, мне нужно иметь также строки для дней, в которых нет строк в таблице со значением 0.

Так, например:

2012-01-01 12:13
2012-01-01 43:32
2012-01-03 23:32

Должен дать мне такой результат:

2012-01-01 2
2012-01-02 0
2012-01-03 1

Кто-нибудь может помочь ??

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Для работы с датами с 0 соответствующими записями моя обычная практика - использовать календарную таблицу для присоединения.

Например, создайте таблицу с одним полем с именем calendar_date и заполните ее каждой датой от 1st Jan 2000 до 31st Dec 2070 или другим диапазоном, который подходит для ваших целей отчетности.

Тогда используйте что-то вроде ...

SELECT
  calendar.calendar_date,
  COUNT(*)
FROM
  calendar
LEFT JOIN
  yourData
    ON  yourData.timeStamp >= calendar.calendar_date
    AND yourData.timeStamp <  calendar.calendar_date + 1
WHERE
      calendar.calendar_date >= '01 Jan 2012'
  AND calendar.calendar_date <  '04 Jan 2012'
GROUP BY
  calendar.calendar_date

Эта таблица может иметь множество дополнительных применений, таких как пометка банковских праздников, начало недель и месяцев. С осторожным использованием флагов и индексов вы можете извлечь из этого многое.

2 голосов
/ 29 февраля 2012

Если у вас нет таблицы со списком дат, вы можете смоделировать ее с помощью следующего запроса:

select * from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) calendar_date from
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where calendar_date between ? /*start of date range*/ and ? /*end of date range*/

- поэтому запрос Демса может стать:

SELECT
  calendar.calendar_date,
  COUNT(*)
FROM
  (select * from 
    (select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) calendar_date from
     (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
     (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
     (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
     (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
     (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
   WHERE calendar_date >= '01 Jan 2012'
     AND calendar_date <  '04 Jan 2012'
  ) calendar
LEFT JOIN
  yourData
    ON  yourData.timeStamp >= calendar.calendar_date
    AND yourData.timeStamp <  calendar.calendar_date + 1
0 голосов
/ 29 февраля 2012

попробуй

SELECT DATE_FORMAT(YourDate, '%Y-%m-%d') as YourDate, COUNT(*)
FROM TableName where YourDate= 'date' 
GROUP BY YourDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...