问题描述
我有两个包含经常更新的天气数据的表格。表 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 |
据我所知,需要发生三件事:
完全不知道如何做到这一点。有人有解决方案吗?
解决方法
我认为不需要 generate_series()
:
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
- 首先每小时从
realized
表中提取每条第一条记录。这可以使用DISTINCT ON
来完成,它返回有序组的第一条记录。此处您的组是小时(使用date_trunc()
,您可以将hh:10
-hh:50
值转换为完整小时以加入组)。 - 使用
FULL JOIN
:即使没有匹配的时间戳,也会连接表 - 使用
COALESCE()
返回列表中的第一个非NULL
值。因此,如果存在realized
温度,则将采用该温度,否则采用预测值。