【问题标题】:How to fill missing dates with time in range?如何用范围内的时间填充缺失的日期?
【发布时间】:2021-03-19 14:32:35
【问题描述】:

我有一个表格,其中有日期和时间,一列有值。每 10 秒,该表应获得一条新记录。它看起来像:

Date                      Val1
2020-10-03 10:12:21       30
2020-10-03 10:12:31       30
2020-10-03 10:12:41       30
2020-10-03 10:12:51       30
2020-10-03 10:13:01       30
...
2020-12-07 10:13:24       20
2020-12-07 10:13:34       20

我需要检查日期之间的值,例如: 从 2020 年 10 月 3 日 10:00 到 2020 年 12 月 7 日 12:30, 每 5/15/30 分钟或 1 小时:

Date                   Val1
2020-10-03 10:00       30
2020-10-03 10:30       30
2020-10-03 11:00       30
2020-10-03 11:30       30
2020-10-03 12:00       30
...
2020-12-07 12:00       20
2020-12-07 12:30       20

我试图在 MySQL 中这样做:

SELECT DATE_FORMAT(Date, "%Y-%m-%d %H:%i") as Date, Val1
FROM table 
WHERE Date >= "2020-10-03 10:00" AND Date <= "2020-12-07 12:30" 
GROUP BY unix_timestamp(Date) 
DIV 1800

但如果我没有每个日期时间,它就不能很好地工作。

如何用 NULL 值填充缺失的日期?我需要每一分钟 (如果间隔以分钟为单位,如果间隔以小时为单位,则每小时一次)。

【问题讨论】:

  • 在没有任何聚合函数的情况下,GROUP BY 子句永远不合适。如需进一步帮助,请参阅:Why should I provide an MCRE for what seems to me to be a very simple SQL query?
  • 您似乎已删除此问题的先前版本及其所有 cmets,而不是对其进行编辑。 如何用 NULL 值填充缺失的日期? 生成此日期列表并加入您的数据。
  • @Akina 我是 MySQL 新手,我真的不知道如何正确地做到这一点。另外,我更喜欢在不创建新表的情况下找到解决方案。

标签: mysql sql aggregate-functions recursive-query date-arithmetic


【解决方案1】:

如果您运行的是 MySQL 8.0,则可以使用递归查询来生成日期范围,然后带上带有 left join 的表:

with recursive cte as (
    select '2020-10-03 10:00:00' dt
    union all select dt + interval 1 minute from cte where dt < '2020-12-07 12:30:00'
)
select c.dt, avg(t.val1) as val1
from cte c
left join mytable t on t.date >= c.dt and t.date < c.dt + interval 1 minute
group by c.dt

如果在一分钟内有多个记录,则取平均值为val1。在这方面,这修复了您的原始查询,该查询在 val1 上缺少聚合函数。

【讨论】:

  • 我有 10+ 个版本。我有错误 mytable.cte 不存在。我在 cte 之前添加了 RECURSIVE 并开始工作,但花了很多时间并以错误结束:504 Gateway Timeout
  • @Justyna:我们确实需要在 MySQL 中使用recursive。固定的。至于超时问题,我真的说不出来。例如,当您将间隔更改为 interval 1 hour 时(在它出现的两个地方),它是否有效?
  • 是的,如果我有超过 1 分钟的时间,它工作得很好。这解决了我的问题 - 关于网关,我必须找到另一个解决方案。为此,我非常感谢您!问候:)
猜你喜欢
  • 2011-04-02
  • 2015-10-19
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多