我很难从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中做到这一点?
答案 0 :(得分:0)
将结果加入到您知道包含所有所需时间的表
像这样: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
如果你没有这样的表,你可以创建一个。 像这样:
CREATE TABLE ref (h INT);
INSERT INTO ref (h)
-> VALUES(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')
到值