postgresql时间序列单个时间戳,数组推断时间

时间:2017-02-18 17:19:12

标签: postgresql

我有一张如下表: -

CREATE TABLE packet_test_short_array
(
  packet_date timestamp without time zone NOT NULL,
  frame_count integer,
  packet_data int2[200],
  CONSTRAINT packet_test_short_array_pk PRIMARY KEY (packet_date)
)
WITH (
  OIDS=FALSE);

有一个时间戳和一组测量值本身偏离主时间戳1秒*它们的阵列位置。

,即位于199位的阵列中的最后一次测量是在主时间戳之后199秒。

我想取消该数组,并为每个成员提供一个递增的时间戳(如上所述)1秒。

The rather nifty krokodilco的回复几乎就是我想要的......

SELECT 1 id, x
FROM    unnest(ARRAY[1,2,3,4,5,6,7,8,22,33]) x

除了'1'没有递增。

我希望这是一个简单的,但我无法发现它。

我非常感谢你的帮助和帮助。请见。

编辑:示例......

所以说我有一个包含10个值的数组的时间戳,如下所示: - '2016-06-01 00:00:00':: timestamp AS packet_date,ARRAY [0,1,2,3,4,5,6,7,8,9] AS packet_data

我想将一个时间戳推断为上升时间序列,间隔为1分钟;即将单个时间戳排除在10行之外,每个时间戳对应1分钟间隔的每个对应值具有自己独特的timstamp。有点像这样......
packet_date,packet_value(从packet_data中取消)
“2016-06-01 00:00:00”,0
“2016-06-01 00:01:00”,1
“2016-06-01 00:02:00”,2
“2016-06-01 00:03:00”,3
“2016-06-01 00:04:00”,4
“2016-06-01 00:05:00”,5
“2016-06-01 00:06:00”,6
“2016-06-01 00:07:00”,7
“2016-06-01 00:08:00”,8
“2016-06-01 00:09:00”,9

我知道如何生成时间序列...
select generate_series(min('2016-06-01 00:00:00':: timestamp),max('2016-06-01 00:00:00':: timestamp + INTERVAL'10 minutes'),interval'1分钟')
但无法看到如何将其与相应的数组成员/值匹配,可以像这样模拟...
选择不需要(ARRAY [0,1,2,3,4,5,6,7,8,9,10])

这有意义吗?

2 个答案:

答案 0 :(得分:2)

你可以将一个时间间隔(在这种情况下是一分钟)乘以一个整数(unnested数组的常数),例如:

with my_table(packet_date, packet_data) as (
values 
    ('2016-06-01 00:00:00'::timestamp, ARRAY[0,1,2,3,4,5,6,7,8,9])
)
select 
    packet_date + '1m'::interval* (ordinality - 1) as packet_date, 
    unnest as packet_data
from my_table,
lateral unnest(packet_data) with ordinality;

     packet_date     | packet_data 
---------------------+-------------
 2016-06-01 00:00:00 |           0
 2016-06-01 00:01:00 |           1
 2016-06-01 00:02:00 |           2
 2016-06-01 00:03:00 |           3
 2016-06-01 00:04:00 |           4
 2016-06-01 00:05:00 |           5
 2016-06-01 00:06:00 |           6
 2016-06-01 00:07:00 |           7
 2016-06-01 00:08:00 |           8
 2016-06-01 00:09:00 |           9
(10 rows)   

答案 1 :(得分:1)

使用with ordinality

SELECT x.id, x.x
FROM unnest(ARRAY[1,2,3,4,5,6,7,8,22,33]) with ordinality x(x, id);

在您的情况下,您还可以使用row_number()

SELECT row_number() over () as id, x.x
FROM unnest(ARRAY[1,2,3,4,5,6,7,8,22,33]) x(x);