我很难从 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/