我有一个表,其中包含以下项:
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
感谢您的帮助。
答案 0 :(得分:2)
这是一个使用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;
您可以根据需要调整日历表的范围。
答案 1 :(得分:0)
您未指定限制。如果要从头到尾填写:
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;
答案 2 :(得分:0)
系列的开始时间和结束时间取自所需的输出。
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