【问题标题】:Presto - Insert Missing TimestampsPresto - 插入缺失的时间戳
【发布时间】:2021-12-13 01:27:29
【问题描述】:

编辑:在下面的帖子中做了一些澄清

我正在尝试解决一个表缺少时间戳的问题。假设有一个这样的表:

Timestamp NumericField
2021-10-24 16:59:00.000 101
2021-10-24 16:57:00.000 101

我想尝试做两件事:

  1. 填充时间戳为 2021-10-24 16:58:00.000 的第三条记录。

  2. 除此之外,如果领先和滞后记录匹配,我想将 NumericField 字段填充为 101,就像在这个例子中一样。结果是:

Timestamp NumericField
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。例如:

Timestamp NumericField
2021-10-24 16:59:00.000 101
2021-10-24 16:58:00.000 NULL
2021-10-24 16:57:00.000 100

我发布这个问题的原因是 Presto 不支持递归 CTE,我找不到任何好的资源来帮助我解决这个问题。

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    我会尝试使用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
    

    输出:

    Timestamp NumericField
    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

    【讨论】:

    • 非常感谢。喜欢使用排序来处理这个特定的用例。非常感谢您!
    • 我唯一的问题是,在期待下一条记录时,仅使用 LAG 是如何工作的?我认为混合使用 LEAD() 和 LAG() 将是合适的方法@Guru Stron
    • @user7298979 您不需要混合使用这两种方法,因为 lag/lead 用于现有数据(即“上一个”和“下一个”值不会因整个间隙而改变),因此,您可以使用其中一个函数(laglead)进行计算,并将结果与​​当前值为“下一个”(或 lead 的“上一个”)作为差距。
    • 那么对于我问题中的第二个示例,它仍然会返回一个空值吗?
    • @user7298979 是的,2021-10-24 16:56:00.000 时间戳的值正好代表了这一点。
    猜你喜欢
    • 2020-03-28
    • 2020-10-23
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多