2017-02-18 91 views
2

我有一个表,看起来像这样: -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秒。

我想unnest数组并给每个成员递增时间戳(如上)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年6月1日00:00:00' ::时间戳packet_date ,ARRAY [0,1,2,3,4,5,6,7,8,9] AS packet_data

我想将一个时间戳推断与的间隔的升序时间序列说1分钟;即将单个时间戳分为10行,每个分隔1分钟,每个对应值具有其自己的不同的时间戳。有点像这样...
packet_date,packet_value(从packet_data嵌套的)
“2016年6月1日00:00:00”,0
“2016年6月1日00:01:00”,1
“2016年6月1日00:02:00”,2
“2016年6月1日00:03:00”,3
“2016年6月1日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“::时间戳+ INTERVAL '10分钟”),间隔“1分钟”)
但不能看到如何与它的相应的数组构件/值可以模拟这样匹配它...
选择unnest(ARRAY [0,1,2,3,4,5,6,7,8,9,10])

这有道理吗?

回答

1

您可以繁殖的时间间隔(在这种情况下,一分钟)一个整数(的序数例如:

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) 
+0

是的,这就是我正在寻找的 - 我不想将数据存储为具有重复元数据的离散值,我不想将表格归一化分成两个表格。元数据与数组中的数据“为我做了”。 非常感谢@klin,我现在有了一个概念证明。 – SteamedUp

+0

还有一点,数据按照阵列中的位置顺序出来非常重要。在本例中,数组中位置0处的数据是在原始时间戳中指定的确切时间;位置99中的数据是原始时间戳后99分钟的数据。 即,数据的时间戳是从它在数组中的位置隐含的。 – SteamedUp

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); 
+0

谢谢你,我很挣扎。我在文章的最后添加了一个例子... – SteamedUp