Postgres - 将包含某些日期数据的表连接到一个包含范围内所有日期的表

时间:2015-08-10 20:48:26

标签: sql postgresql date join range

我有一张桌子,'dailymetrics'包含某些日期的数据。我想加入一个包含范围内所有日期的表格,以便我可以在一个日期范围内进行平均。我正在尝试生成我想要的日期范围,然后使用表'dailymetrics'进行左外连接。但是,输出仅包含“dailymetrics”表中已存在的日期。如何让输出表包含范围内的所有日期?

查询

SELECT day::date, dm.person_id, dm.latency
FROM generate_series('2015-08-01', '2015-08-10', INTERVAL '1 day') day
LEFT OUTER JOIN sleeptracking_dailymetrics as dm
ON dm.date=day
ORDER BY dm.person_id, day DESC;

当前输出样本:

   day     | person_id |    latency    
------------+-----------+---------------
2015-08-08 |       847 |            56
2015-08-06 |       847 |            60
2015-08-05 |       847 |            88
2015-08-04 |       847 |            46
2015-08-03 |       847 |            24
2015-08-01 |       847 |             0

2015-08-07和2015-08-02的行不存在。

1 个答案:

答案 0 :(得分:1)

我猜你在数据中有多个人,并且你的查询过于简单。您需要在日期和人员之间进行交叉联接,然后执行left join

SELECT day::date, p.person_id, dm.latency
FROM (select distinct person_id from sleeptracking_dailymetrics) p cross join
     generate_series('2015-08-01', '2015-08-10', INTERVAL '1 day') day left join
     sleeptracking_dailymetrics dm
     ON dm.date = day and dm.person_id = p.person_id
ORDER BY p.person_id, day DESC;

cross join生成所有行。 left join然后会引入您想要的数据。