即使没有阅读,MySQL也会每小时选择平均读数

时间:2017-12-05 15:59:52

标签: 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中做到这一点?

1 个答案:

答案 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')到值