Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为postgres DB中不存在的行数据显示空值_Sql_Postgresql - Fatal编程技术网

Sql 为postgres DB中不存在的行数据显示空值

Sql 为postgres DB中不存在的行数据显示空值,sql,postgresql,Sql,Postgresql,我有下面的数据集,看起来像这样 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

我有下面的数据集,看起来像这样

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内不存在的所有数据,我想将null(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时获取data_id(4,5,6)的空值,也没有在t=4/14/2010 0:20时获取data_id(4,5)的空值。

只需在定义
数据集满时包含所需的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
            (values (1), (2), (4), (5), (6)) d(data_id) left join
            dataset ds
            on ds.t = t.t and ds.data_id = d.data_id
     )
交叉联接的目的是获取结果集中所需的所有记录。因此,包括您想要的ID和时间戳。然后,
左连接
会引入适当的数据(如果有)