【问题标题】:postgresql time series single time stamp with array inferred time带有数组推断时间的 postgresql 时间序列单个时间戳
【发布时间】:2017-07-08 04:18:23
【问题描述】:

我有一个如下所示的表格:-

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 秒 * 它们的数组位置。

即,数组中 pos 199 处的最后一次测量是在主时间戳之后 199 秒。

我想取消嵌套数组并给每个成员一个递增的时间戳(如上)1 秒。

The rather niftykrokodilco 的回复几乎是我想要的...

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 分钟。有点像这样...
数据包日期、数据包值(未从数据包数据中嵌套)
"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

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

这有意义吗?

【问题讨论】:

    标签: postgresql


    【解决方案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)   
    

    【讨论】:

    • 是的,这就是我要找的——我不想将数据存储为具有重复元数据的离散值,也不想将表格标准化为两个表格。带有数组中数据的元数据“为我做”。非常感谢@klin,我现在有了概念证明。
    • 还有一点,数据按照它在数组中的位置顺序出现非常重要。在此示例中,数组中位置 0 处的数据是原始时间戳中指定的确切时间;位置 99 的数据是原始时间戳后 99 分钟的数据。即,数据的时间戳是隐含在数组中的位置。
    【解决方案2】:

    使用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);
    

    【讨论】:

    • 谢谢你,我很挣扎。我在帖子末尾添加了一个示例...
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2013-03-27
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多