我有下面这个数据集。
t mean max min std data_id
4/14/2010 0:00 12.6941 12.6941 12.6941 12.6941 1
4/14/2010 0:00 12.3851 12.3851 12.3851 12.3851 2
4/14/2010 0:20 12.389 12.389 12.389 12.389 1
4/14/2010 0:20 12.1836 12.1836 12.1836 12.1836 2
4/14/2010 0:20 11.3887 11.3887 11.3887 11.3887 6
这里唯一的数据id是(1,2,6),但是我有另一个数据id集(1,2,4,5,6),我想用它来获取数据。
现在,对于时间t内不存在的所有数据,我想将空值(mean,max.std,min)添加到它们中,因此在这种情况下,我希望得到以下结果集:
'2010-04-14 00:00:00','12.6941,12.6941,12.6941,12.6941,12.3851,12.3851,12.3851,12.3851,,,,,,,,,,,,,'
'2010-04-14 00:20:00','12.389,12.389,12.389,12.389,12.1836,12.1836,12.1836,12.1836,,,,,,,,,11.3887,11.3887,11.3887,11.3887'
我使用了以下查询:
with dataset as (
select *
from (values ('2010-04-14T00:00'::TIMESTAMP, 12.6941, 12.6941, 12.6941, 12.6941, 1),
('2010-04-14T00:00'::TIMESTAMP, 12.3851, 12.3851, 12.3851, 12.3851, 2),
('2010-04-14T00:20'::TIMESTAMP, 12.389, 12.389, 12.389, 12.389, 1),
('2010-04-14T00:20'::TIMESTAMP, 12.1836, 12.1836, 12.1836, 12.1836, 2),
('2010-04-14T00:20'::TIMESTAMP, 11.3887, 11.3887, 11.3887, 11.3887, 6)
) AS data(t, mean, max, min, std, data_id)
),
dataset_full as (
select t.t, d.data_id,
ds.mean, ds.max, ds.min, ds.std
from (select distinct t from dataset) t cross join
(select distinct data_id from dataset) d left join
dataset ds
on ds.t = t.t and ds.data_id = d.data_id
)
select t,string_agg(concat(mean, ',', max, ',', min, ',', std), ',' order by data_id)
from dataset_full
group by t
order by t;
我得到以下结果:
'2010-04-14 00:00:00','12.6941,12.6941,12.6941,12.6941,12.3851,12.3851,12.3851,12.3851,,,,'
'2010-04-14 00:20:00','12.389,12.389,12.389,12.389,12.1836,12.1836,12.1836,12.1836,11.3887,11.3887,11.3887,11.3887'
我没有在=4/14/2010 0:00和T=4/14/2010 0:20得到数据ID(4,5,6)的空值。