Отображать разделенные запятыми значения для не существующих строк в таблице - PullRequest
0 голосов
/ 29 мая 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:10  12.389  12.389  12.389  12.389           1
4/14/2010 0:10  12.1836 12.1836 12.1836 12.1836          2
4/14/2010 0:10  11.3887 11.3887 11.3887 11.3887          3

Я хочу преобразовать данные в

t,str_agg
'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:10:00','12.3890','12.3890','12.3890','12.3890','12.1836','12.1836','12.1836','12.1836','11.3887','11.3887','11.3887','11.3887'

Так что, если вы посмотрите на результат, данных дляdata_id 3 для t = 4/14/2010 0:00, поэтому в результате не будет значений, разделенных запятыми.

Я хочу получить этот результат в postgres.Я пробовал следующий запрос: -

select t,string_agg(mean||','||max||','||min||','||std,',') within group(order by t)  
from table_name 
group by t  
order by t;

, но это дает мне следующий результат: -

t,str_agg
'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:10:00','12.3890','12.3890','12.3890','12.3890','12.1836','12.1836','12.1836','12.1836','11.3887','11.3887','11.3887','11.3887'

1 Ответ

0 голосов
/ 30 мая 2018
WITH dataset AS (
    SELECT *
    FROM
        (
            VALUES
            ('2010-04-14T00:00'::TIMESTAMP, 1, 1, 1, 1, 1),
            ('2010-04-14T00:00'::TIMESTAMP, 2, 2, 2, 2, 2),
            ('2010-04-14T00:20'::TIMESTAMP, 3, 3, 3, 3, 1),
            ('2010-04-14T00:20'::TIMESTAMP, 4, 4, 4, 4, 2),
            ('2010-04-14T00:20'::TIMESTAMP, 5, 5, 5, 5, 3)
        ) AS data(t, mean, max, min, std, data_id)
),
timestamps AS (
    SELECT t FROM dataset GROUP BY t
),
data_id AS (
    SELECT data_id AS id FROM dataset GROUP BY data_id
),
dataset_full AS (
    SELECT
        coalesce(dataset.t, ts.t) AS t,
        mean,
        max,
        min,
        std,
        data_id
    FROM
--         generate_series(
--                 (SELECT min(t) FROM dataset),
--                 (SELECT max(t) FROM dataset),
--                 '10 minutes')
--             AS ts(t)
        timestamps AS ts
--        CROSS JOIN generate_series(
--                       (SELECT min(data_id) FROM dataset),
--                       (SELECT max(data_id) FROM dataset))
--            AS data_id(id)
        CROSS JOIN data_id
        LEFT JOIN dataset ON ts.t = dataset.t AND data_id.id = dataset.data_id
)
SELECT
    t,
    string_agg(concat(mean, ',', max, ',', min, ',', std), ',')
FROM dataset_full
GROUP BY t
ORDER BY t;
  • Набор данных CTE (общее табличное выражение) находится прямо на месте вашей таблицы.

  • dataset_full добавляет все пропущенные строки, генерируя строки для каждой комбинации интервала 10 м и значения data_id. набор данных затем присоединяется к нему влево, что означает, что теперь для этих ранее несуществующих строк есть значения NULL.Значения NULL затем преобразуются в пустую строку в string_agg, в результате чего вы хотите.

РЕДАКТИРОВАТЬ
Я изменил его в ответ на запрос OP в комментариях такчто он возвращает только строки с метками времени, которые существуют в исходном наборе данных.

РЕДАКТИРОВАТЬ 2
Я изменил его для другого запроса OP, чтобы использовать только data_ids из набора данных.

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