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

问题描述

我有两个包含经常更新的天气数据的表格。表 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

表 B(天气预报)

观察时间 温度
17/02/21 04:00 9
17/02/21 05:00 9
17/02/21 06:00 9
17/02/21 07:00 9

我想要的

观察时间 realized_temperature forecasted_temperature
17/02/21 00:00 9
17/02/21 01:00 9
17/02/21 02:00 9
17/02/21 03:00 9
17/02/21 04:00 9
17/02/21 05:00 9
17/02/21 06:00 9
17/02/21 07:00 9

据我所知,需要发生三件事:

  • 首先,我需要从表 A 中获取最小的时间戳,并将其四舍五入到最小的整小时
  • 从预测表中获取最大时间戳
  • 在这两个时间戳之间生成一个序列,间隔为 1 小时
  • 生成的系列上加入表 A 和 B

完全不知道如何做到这一点。有人有解决方案吗?

解决方法

我认为不需要 generate_series()

demo:db<>fiddle

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
  1. 首先每小时从 realized 表中提取每条第一条记录。这可以使用 DISTINCT ON 来完成,它返回有序组的第一条记录。此处您的组是小时(使用 date_trunc(),您可以将 hh:10 - hh:50 值转换为完整小时以加入组)。
  2. 使用 FULL JOIN:即使没有匹配的时间戳,也会连接表
  3. 使用 COALESCE() 返回列表中的第一个非 NULL 值。因此,如果存在 realized 温度,则将采用该温度,否则采用预测值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...