MySQL每小时​​选择平均读数,即使没有读数

标签 mysql

我很难从 Postgres 中为我们正在迁移的项目创建 MySQL 语句。我不会给出确切的用例,因为它非常复杂,但我可以创建一个简单的类似情况。

我们有一个绘图工具,需要每小时间隔输出一些原始数据。在 Postgres 中,SQL 会生成一个时间跨度内的日期和时间序列,然后它会针对该日期和小时存在的平均值加入一个查询。例如,我们能够获得每小时的平均销售额,即使该数字为 0。

这是一个表格示例:

Sales
datetime            | sale
2017-12-05 08:34:00 | 10
2017-12-05 08:52:00 | 20
2017-12-05 09:15:00 | 5
2017-12-05 10:22:00 | 10
2017-12-05 10:49:00 | 10

类似的地方

SELECT DATE_FORMAT(s.datetime,'%Y%m%d%H') as "byhour", AVG(s.sale) as "avg sales" FROM sales s  GROUP BY byhour

会产生

byhour     | avg sales
2017120508 | 10
2017120509 | 5
2017120510 | 10

我想要一些可以给我过去 24 小时的信息,甚至是 0/NULL 值,例如

byhour     | avg sales
2017120501 | null
2017120502 | null
2017120503 | null
2017120504 | null
2017120505 | null
2017120506 | null
2017120507 | null
2017120508 | 10
2017120509 | 5
2017120510 | 10
...
2017120600 | null

有人知道如何在 MySQL 中做到这一点吗?

最佳答案

将结果加入到您知道包含所有所需时间的表格中

像这样的东西:

SELECT 
* FROM (
SELECT 
    DATE_FORMAT(s.datetime, '%Y%m%d%H') AS 'byhour'
FROM
    table_that_has_hours
GROUP BY byhour) hours LEFT OUTER JOIN (
SELECT 
    DATE_FORMAT(s.datetime, '%Y%m%d%H') AS 'byhour',
        AVG(s.sale) AS 'avg sales'
FROM
    sales s
GROUP BY byhour) your_stuff ON your_stuff.byhour = hours.by_hours

如果您没有这样的表,您可以创建一个。 像这样:

创建表引用(h INT);

插入引用 (h) -> 值(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11) , -> (12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23)

然后您只需DATE_FORMAT(date(now()),'%Y%m%d%H') 到值

关于MySQL每小时​​选择平均读数,即使没有读数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47657764/

相关文章:

php - Where + 和 Where from 模型

sql - 具有多个 JOINS 和 GROUP BY CLAUSE 的查询中的 COUNT

mysql - 区分数据集并将大量行更新/插入到大型 MySQL 表中的最快方法?

php - 如何根据单个表中以逗号分隔的id获取用户名

php - 在mysql查询中使用php time()函数计算两个日期之间的差异

javascript - 使用javascript从2个选择字段计算数据到输入字段

mysql - 使用 != 条件运算符时不会选择默认空值

mysql - 级联删除数据库记录到删除相关图像文件

mysql - 从 Prestashop DB 获取最新值(value)

MySQL创建表并从另一个表设置属性?