Отображать нулевые значения для несуществующих данных строки в базе данных postgres - PullRequest
0 голосов
/ 02 июня 2018

У меня есть следующий набор данных, который выглядит следующим образом.

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

Здесь уникальный data_id (1,2,6), но у меня есть другой набор data_id (1,2,4,5,6)), который я хочу использовать для получения данных.

Теперь для всех data_id, отсутствующих в течение времени, я хочу добавить к ним значения 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'

Я не получаю нулевые значения для data_id (4,5,6) в = 14.04.2010 0:00 и data_id (4,5) в t = 4/14/2010 0: 20.

1 Ответ

0 голосов
/ 02 июня 2018

Просто включите идентификаторы, которые вы хотите, когда определяете 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 - получить все нужные записи в наборе результатов.Итак, включите идентификаторы и временные метки, которые вы хотите.left join затем вводит соответствующие данные, если таковые имеются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...