代码之家  ›  专栏  ›  技术社区  ›  Sunny

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

  •  0
  • Sunny  · 技术社区  · 7 年前

    我有下面这个数据集。

    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)的空值。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    只需包含定义时所需的ID data_set_full :

    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
         )
    

    目的 cross join 就是在结果集中得到所有你想要的记录。所以,包括你想要的id和时间戳。这个 left join 然后输入适当的数据(如果有的话)。