sql - Presto - 插入缺失的时间戳
问题描述
编辑:在下面的帖子中做了一些澄清
我正在尝试解决我有一个缺少时间戳的表的问题。假设有一个这样的表:
时间戳 | 数值字段 |
---|---|
2021-10-24 16:59:00.000 | 101 |
2021-10-24 16:57:00.000 | 101 |
我想尝试做两件事:
填充时间戳为 2021-10-24 16:58:00.000 的第三条记录。
除此之外,如果领先和滞后记录匹配,我想将 NumericField 字段填充为 101,就像在这个例子中一样。结果将是:
时间戳 | 数值字段 |
---|---|
2021-10-24 16:59:00.000 | 101 |
2021-10-24 16:58:00.000 | 101 |
2021-10-24 16:57:00.000 | 101 |
如果超前和滞后 NumericField 记录不匹配,则生成的 NumericField 将导致 null。示例是:
时间戳 | 数值字段 |
---|---|
2021-10-24 16:59:00.000 | 101 |
2021-10-24 16:58:00.000 | 无效的 |
2021-10-24 16:57:00.000 | 100 |
我发布这个问题的原因是 Presto 不支持递归 CTE,我找不到任何好的资源来帮助我解决这个问题。
解决方案
我会尝试使用lag
来查找以前的值,然后sequence
使用步骤生成日期数组,将interval '1' minute
其取消嵌套并将结果与原始表合并:
WITH dataset (Timestamp, NumericField) AS (
VALUES (timestamp '2021-10-24 16:59:00.000', 101),
(timestamp '2021-10-24 16:57:00.000', 101),
(timestamp '2021-10-24 16:55:00.000', 99)
)
SELECT date as Timestamp,
val as NumericField
FROM (
SELECT array_except(
sequence(prev_ts, Timestamp, interval '1' minute),
array [ prev_ts, timestamp ] -- exclude border values
) as dates,
case
NumericField
when prev_num then prev_num
end as val
FROM (
SELECT *,
lag(Timestamp) over(order by Timestamp) prev_ts,
lag(NumericField) over(order by Timestamp) prev_num
FROM dataset
)
) seq
CROSS JOIN UNNEST(dates) AS t (date)
UNION
SELECT *
FROM dataset
ORDER BY timestamp
输出:
时间戳 | 数值字段 |
---|---|
2021-10-24 16:55:00.000 | 99 |
2021-10-24 16:56:00.000 | |
2021-10-24 16:57:00.000 | 101 |
2021-10-24 16:58:00.000 | 101 |
2021-10-24 16:59:00.000 | 101 |
推荐阅读
- lua - 如何去混淆lua脚本?
- python - 我在尝试使用 kivy 切换屏幕时遇到问题
- sql-server - SQL Management Studio 显示网络驱动器
- python - Pandas 数据框中的多个输出(Python Web 抓取)
- mysql - SQLite查询用于按字符串顺序检索数据
- ruby-on-rails - rails mailer 在同一封邮件中生成 html 和 text
- asp.net - 尝试分配会话变量时按钮停止工作
- html - 如何将弹性项目的高度设置为其父项高度的 100%?
- java - 填充地图
Spring中创建Bean - c# - Visual Studio 没有折叠/展开选项