如何在两个表的最小和最大时间戳之间生成序列(Postgresql)

如何在两个表的最小和最大时间戳之间生成序列(Postgresql),postgresql,generate-series,Postgresql,Generate Series,我有两张表,上面有经常更新的天气数据。表A的数据间隔为10分钟,表B的数据间隔为1小时 表A(已实现的天气) 观测时间 温度 17/02/21 00:00 9 17/02/21 00:10 9 17/02/21 00:20 9 17/02/21 00:30 9 ... ... 17/02/21 03:00 9 在我看来,不需要generate_series(): 首先从实现的表中提取每小时的第一条记录。这可以使用DISTINCT ON来完成,它返回一个有序组的第一条记录。这里您的组是小时(使用

我有两张表,上面有经常更新的天气数据。表A的数据间隔为10分钟,表B的数据间隔为1小时

表A(已实现的天气)

观测时间 温度 17/02/21 00:00 9 17/02/21 00:10 9 17/02/21 00:20 9 17/02/21 00:30 9 ... ... 17/02/21 03:00 9
在我看来,不需要
generate_series()

  • 首先从
    实现的
    表中提取每小时的第一条记录。这可以使用
    DISTINCT ON
    来完成,它返回一个有序组的第一条记录。这里您的组是小时(使用
    date\u trunc()
    您可以将
    hh:10
    -
    hh:50
    值转换为加入组的完整小时)
  • 使用
    完全联接
    :即使没有匹配的时间戳,也会联接表
  • 使用
    COALESCE()
    返回列表中第一个非空值。因此,如果存在
    实现的
    温度,则将采用该温度,否则将采用预测温度

  • 嗨,谢谢你!真棒的解释!是的,它解决了这个问题。非常感谢。然而,有时观测到的温度和预报可能会有小的重叠。有没有办法实现这一点,使实现的温度和预测的温度列是连续的?如果数据不连续,则无法为所有数据绘制线图。。。我想它也适用于散点图。:)我不知道该怎么办。我相信,做一些迂回可能会有所帮助。
    SELECT
        COALESCE(r.observationtime, fc.observationtime) as observationtime,     -- 3
        r.temperature as realized_temperature,
        fc.temperature as forecasted_temperature
    FROM (
        SELECT DISTINCT ON (date_trunc('hour', observationtime))                -- 1
            *
        FROM r
        ORDER BY date_trunc('hour', observationtime), observationtime
    ) r
    FULL JOIN fc ON r.observationtime = fc.observationtime                      -- 2
    ORDER BY 1