2017-02-18 30 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