mysql - 在 GROUP BY 子句中返回空行

标签 mysql sql database data-warehouse

<分区>

我有一个查询来检索两个日期之间每天的事件总数。

SELECT
  DATE_FORMAT(startTime, '%Y%m%d') as day,
  COUNT(0) as numEvents
FROM events
WHERE
  (startTime BETWEEN 20140105000000 AND 20140112235900)
GROUP BY
  day;

这会返回一个类似的列表

day      | numEvents
---------+----------
20140105 | 45
20140107 | 79
20140108 | 12
20140109 | 56

请注意结果中缺少天数,因为这些天的事件表中没有事件。有什么方法可以为那些日子返回 0 值,从而导致:

day      | numEvents
---------+----------
20140105 | 45
20140106 | 0
20140107 | 79
20140108 | 12
20140109 | 56
20140110 | 0
20140111 | 0
20140112 | 0

最佳答案

SO上有不少解决方案:

One solution对您来说是另一个包含所有可能/相关日期的表格。一种实现可以在这里找到:https://stackoverflow.com/a/7262803/1085891

This is typically done in data warehouses by having a date dimension that has a list of all possible dates. You do an OUTER JOIN to the date dimension and COALESCE the null values to 0.

如果经常运行,存储日期会更有效率。但是,对于快速报告,您可以生成所需的日期并将输出连接到您正在搜索的表中。

关于mysql - 在 GROUP BY 子句中返回空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21063779/

相关文章:

MySQL 和 phpMyAdmin 创建三向关系

mysql - 如何在 mysql 中实现该 SQL 查询?

sql - Postgres慢查询(慢索引扫描)

javascript - 我如何将 Mongoose 中的字符串大写?

php - 来自 SQL 的多维 PHP 数组,用于 json_encode

mysql - 使用嵌套集模型时跟踪更改

mysql - 将字符串连接到 SELECT * MySql

sql - 如何从postgres中的查询中提取小时数

PHP - mysql_numrows() 期望参数 1 是资源, bool 值给出

mysql:在一个查询中选择、插入、删除和更新