кросс-соединение в минуту временной ряд postgresql - PullRequest
0 голосов
/ 27 июня 2018

У меня есть таблица с пунктами, как показано ниже:

Item_id,  Item_time,             Item_numbers
  1       2017-01-01 18:00:00       2
  2       2017-01-01 18:10:00       2
  3       2017-01-01 19:10:00       3
  4       2017-01-02 19:11:00       3
  5       2017-01-02 19:12:00       4

Я хочу иметь временной ряд, который выводит номера элементов в минуту, и в случае, если для конкретной метки времени нет записи, тогда это должна быть нулевая запись.

Желаемый вывод:

            Item_time          Item_numbers
         2017-01-01 18:00:00       2
         2017-01-01 18:01:00       null
         2017-01-01 18:02:00       null
                    .
                    .
                    .
         2017-01-02 19:11:00       3 
         2017-01-02 19:12:00       4    

Любая помощь приветствуется.

Ответы [ 3 ]

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

Вы не указываете пределы. Если вы хотите заполнить с начала до конца:

select ts.item_time, i.item_numbers
from (select generate_series(min(item_time), max(item_time), interval '1 minute') as item_time
      from items
     ) gs(ts) left join
     items i
     on i.item_time = ts.item_time;

Предполагается, что во времени нет секундных (субминутных) частей. Если это возможно, обрежьте значения:

select ts.item_time, i.item_numbers
from (select generate_series(date_trunc('minute', min(item_time)),
                             date_trunc('minute', max(item_time)),
                             interval '1 minute'
                            ) as item_time
      from items
     ) ts left join
     items i
     on date_trunc('minute', i.item_time) = ts.item_time;
0 голосов
/ 27 июня 2018

Время начала и время окончания серии берется из желаемого выхода.

    select
      s as item_time,
      i.item_number
    from items i
    right join 
    generate_series('2017-01-01 18:00:00'::timestamp,
                    '2017-01-02 19:12:00'::timestamp,
                    '1m') s on i.item_time=s
0 голосов
/ 27 июня 2018

Вот один вариант, который использует generate_series для создания таблицы календаря:

WITH cte AS (
    SELECT x
    FROM generate_series(timestamp '2017-01-01 00:00'
                       , timestamp '2017-12-31 00:00'
                       , interval  '1 min') t(x)
)

SELECT t1.x AS Item_time, t2.Item_numbers
FROM cte t1
LEFT JOIN your_table t2
    ON t1.Item_time = t2.Item_time
ORDER BY
    t1.x;

При необходимости вы можете настроить диапазон таблицы календаря.

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