【问题标题】:SQL insert values from previous date if specific date information is missing如果缺少特定日期信息,则 SQL 插入前一个日期的值
【发布时间】:2020-06-03 10:42:40
【问题描述】:

我有下表。

date2                     Group    number
2020-28-05 00:00:00         A        55
2020-28-05 00:00:00         B        1.09
2020-28-05 00:00:00         C        1.8
2020-29-05 00:00:00         A        68
2020-29-05 00:00:00         B        1.9
2020-29-05 00:00:00         C        1.19
2020-01-06 00:00:00         A        10
2020-01-06 00:00:00         B        15
2020-01-06 00:00:00         C        0.88
2020-02-06 00:00:00         A        22
2020-02-06 00:00:00         B        15
2020-02-06 00:00:00         C        13
2020-03-06 00:00:00         A        66
2020-03-06 00:00:00         B        88
2020-03-06 00:00:00         C        99

如您所见,此表中缺少日期 2020-30-05 和 2020-31-05。因此,有必要使用按 GROUP 分组的 2020-29-05 信息填写这些日期。结果最终的输出应该是这样的:

date2                     Group    number
2020-28-05 00:00:00         A        55
2020-28-05 00:00:00         B        1.09
2020-28-05 00:00:00         C        1.8
2020-29-05 00:00:00         A        68
2020-29-05 00:00:00         B        1.9
2020-29-05 00:00:00         C        1.19
2020-30-05 00:00:00         A        68
2020-30-05 00:00:00         B        1.9
2020-30-05 00:00:00         C        1.19
2020-31-05 00:00:00         A        68
2020-31-05 00:00:00         B        1.9
2020-31-05 00:00:00         C        1.19
2020-01-06 00:00:00         A        10
2020-01-06 00:00:00         B        15
2020-01-06 00:00:00         C        0.88
2020-02-06 00:00:00         A        22
2020-02-06 00:00:00         B        15
2020-02-06 00:00:00         C        13
2020-03-06 00:00:00         A        66
2020-03-06 00:00:00         B        88
2020-03-06 00:00:00         C        99

我尝试通过以下方式进行操作: 创建一个临时表(表 B),其中仅包含 2020-28-05 到 2020-03-06 期间的日期,然后使用左合并,从而使这些新日期为空(以便在空时插入 CASE,所以填写在最后一个值)。但是,它不起作用,因为在合并时我只得到一个日期的空值(但应该是一个日期的 3 倍(因为组)。这只是较大数据集的一部分,你能帮助我如何获得必要的输出? PS我用Vertica

【问题讨论】:

    标签: sql datetime vertica


    【解决方案1】:

    这是 Vertica。而且 Vertica 有 TIMESERIES 子句,这似乎完全符合您的需要:

    在一个时间序列之外 - 就像你有一个 - 行之间的间隔不规则,或者在其他规则的时间序列中有更长的间隔,它会创建一个规则的时间序列,每个行对之间的间隔与您指定的相同在TIMESERIES 子句本身的AS 子句中。 TS_FIRST_VALUE()TS_LAST_VALUE() 是依赖于该子句并返回从生成时间戳的输入行推导出的正确值的函数。这个正确的值可以得到'const',即从原始行集中最接近生成时间戳的行,或者'linear',即从生成时间戳之前的原始行和之后的原始行插值得到时间戳。根据您的需要,您将使用常量值。见这里:

    WITH
    -- your input ....
    input(tmstmp,grp,nbr) AS (
              SELECT TIMESTAMP '2020-05-28 00:00:00','A',55
    UNION ALL SELECT TIMESTAMP '2020-05-28 00:00:00','B',1.09
    UNION ALL SELECT TIMESTAMP '2020-05-28 00:00:00','C',1.8
    UNION ALL SELECT TIMESTAMP '2020-05-29 00:00:00','A',68
    UNION ALL SELECT TIMESTAMP '2020-05-29 00:00:00','B',1.9
    UNION ALL SELECT TIMESTAMP '2020-05-29 00:00:00','C',1.19
    UNION ALL SELECT TIMESTAMP '2020-06-01 00:00:00','A',10
    UNION ALL SELECT TIMESTAMP '2020-06-01 00:00:00','B',15
    UNION ALL SELECT TIMESTAMP '2020-06-01 00:00:00','C',0.88
    UNION ALL SELECT TIMESTAMP '2020-06-02 00:00:00','A',22
    UNION ALL SELECT TIMESTAMP '2020-06-02 00:00:00','B',15
    UNION ALL SELECT TIMESTAMP '2020-06-02 00:00:00','C',13
    UNION ALL SELECT TIMESTAMP '2020-06-03 00:00:00','A',66
    UNION ALL SELECT TIMESTAMP '2020-06-03 00:00:00','B',88
    UNION ALL SELECT TIMESTAMP '2020-06-03 00:00:00','C',99
    )
    -- real query here ...
    SELECT
      ts AS tmstmp
    , grp
    , TS_FIRST_VALUE(nbr,'const') AS nbr
    FROM input
    TIMESERIES ts AS '1 DAY' OVER(PARTITION BY grp ORDER BY tmstmp)
    ORDER BY 1,2
    ;
    -- out        tmstmp        | grp |  nbr  
    -- out ---------------------+-----+-------
    -- out  2020-05-28 00:00:00 | A   | 55.00
    -- out  2020-05-28 00:00:00 | B   |  1.09
    -- out  2020-05-28 00:00:00 | C   |  1.80
    -- out  2020-05-29 00:00:00 | A   | 68.00
    -- out  2020-05-29 00:00:00 | B   |  1.90
    -- out  2020-05-29 00:00:00 | C   |  1.19
    -- out  2020-05-30 00:00:00 | A   | 68.00
    -- out  2020-05-30 00:00:00 | B   |  1.90
    -- out  2020-05-30 00:00:00 | C   |  1.19
    -- out  2020-05-31 00:00:00 | A   | 68.00
    -- out  2020-05-31 00:00:00 | B   |  1.90
    -- out  2020-05-31 00:00:00 | C   |  1.19
    -- out  2020-06-01 00:00:00 | A   | 10.00
    -- out  2020-06-01 00:00:00 | B   | 15.00
    -- out  2020-06-01 00:00:00 | C   |  0.88
    -- out  2020-06-02 00:00:00 | A   | 22.00
    -- out  2020-06-02 00:00:00 | B   | 15.00
    -- out  2020-06-02 00:00:00 | C   | 13.00
    -- out  2020-06-03 00:00:00 | A   | 66.00
    -- out  2020-06-03 00:00:00 | B   | 88.00
    
    

    【讨论】:

    • 感谢您的帮助
    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多