我有一张桌子,'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的行不存在。
答案 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
然后会引入您想要的数据。