MySQL Query GROUP BY day / month / year
是否可以简单查询我在确定的时间段(如一年、一个月或一天)内有多少个记录,其中有一个
甚至:
每月做一次统计。
谢谢!
查看MySQL中的日期和时间函数。
1 |
注意(主要是针对潜在的下选者)。目前,这可能不如其他建议有效。尽管如此,我还是把它作为一个替代方案,而且也是一个替代方案,它可以帮助我们了解其他解决方案的速度有多快。(因为你看不到区别,就不能从慢到快)而且,随着时间的推移,MySQL的引擎在优化方面也会发生变化,从而使这个解决方案在未来的某个时候(也许,不那么遥远)变得与大多数其他解决方案的效率相当。
我尝试使用上面的"Where"语句,我认为它是正确的,因为没有人更正它,但我错了;经过一些搜索,我发现这是Where语句的正确公式,因此代码变成这样:
试试这个
提取(日期单位)函数更好,因为使用的分组更少,并且函数返回一个数值。
分组时的比较条件将比日期格式函数(返回字符串值)快。尝试使用为SQL比较条件(其中,having,order by,group by)返回非字符串值的函数字段。
如果您的搜索时间超过几年,并且您仍然希望每月分组,我建议:
版本1:
1 2 3 | SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*) FROM stats GROUP BY DATE_FORMAT(record_date, '%Y%m') |
版本2(更高效):
1 2 3 |
我把这些版本与1357918行(innodb)在一张大桌子上进行了比较。第二个版本似乎有更好的结果。
版本1(平均执行10次):1.404秒
版本2(平均执行10次):0.780秒
(添加了
如果要在MySQL中按日期分组,请使用以下代码:
1 2 3 |
希望这能为那些将要找到这条线的人节省一些时间。
如果要筛选特定年份(例如2000年)的记录,请优化
1 2 3 4 5 |
而不是:
结果是根据包含300K行和"日期"列索引的表生成的。
关于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SELECT YEAR(date_column), MONTH(date_column), COUNT(*) FROM date_table GROUP BY YEAR(date_column), MONTH(date_column) -- codelogic -- average 0.250 sec. SELECT YEAR(date_column), MONTH(date_column), COUNT(*) FROM date_table GROUP BY DATE_FORMAT(date_column, '%Y%m') -- Andriy M -- average 0.468 sec. SELECT YEAR(date_column), MONTH(date_column), COUNT(*) FROM date_table GROUP BY EXTRACT(YEAR_MONTH FROM date_column) -- fu-chi -- average 0.203 sec. |
最后一个是胜利者。
完整而简单的解决方案,具有同样的性能,但目前更短、更灵活的替代方案:
1 2 3 | SELECT COUNT(*) FROM stats -- GROUP BY YEAR(record_date), MONTH(record_date), DAYOFMONTH(record_date) GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d') |
如果要获取按最新月份订购的每年每月行计数的月度统计数据,请尝试以下操作:
1 2 3 4 5 6 7 8 |
您可以在group by中简单地执行mysql date_format()函数。您可能需要添加一个额外的列,以便在某些情况下(例如,记录跨几年,而同一个月在不同的年份中发生)更加清晰。这里有许多选项可供自定义。请在开始前阅读此内容。希望对你有很大帮助。这是您理解的示例查询
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT COUNT(id), DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY, DATE_FORMAT(record_date, '%Y-%m') AS MONTH, DATE_FORMAT(record_date, '%Y') AS YEAR, FROM stats WHERE YEAR = 2009 GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d '); |
以下查询在Oracle数据库12c版本12.1.0.1.0中对我有效。
1 2 3 4 5 6 |
我更喜欢这样优化一年的团队选择:
1 2 3 4 |
这样,您只需使用命名参数一次性绑定年份,例如
另外,我们大概只是在计算行数,而