如何在MySQL中的无行日中对每天的行数进行分组?

时间:2012-02-29 12:33:52

标签: mysql sql

所以我有这张桌子。它有几百行。每行中都有一个日期时间字段。我需要知道的是在给定的时间段内获得多少行,但不是整个时期,而是在此期间的每一天。直到这一点,我知道该怎么做。但此外,我还需要在表中没有任何行的行中包含值为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 个答案:

答案 0 :(得分:3)

要处理带有0个相应记录的日期,我通常的做法是使用日历表加入。

例如,创建一个名为calendar_date的字段的表格,并使用1st Jan 200031st 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

此表可以有许多额外用途,例如标记银行假日,周和月的开始。谨慎使用标志和索引,你可以从中获得很多。

答案 1 :(得分:2)

如果您没有包含日期​​列表的表格,您可以使用以下查询进行模拟:

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*/

- 所以Dems的查询可能会变成:

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

答案 2 :(得分:0)

尝试

SELECT DATE_FORMAT(YourDate, '%Y-%m-%d') as YourDate, COUNT(*)
FROM TableName where YourDate= 'date' 
GROUP BY YourDate