PostgreSQL行差异时间戳,并计算组

时间:2017-07-11 08:25:31

标签: postgresql

我有一个名为 mmsi 的ID列和另一列 timestamp 的表,每个mmsi有多个时间戳。

对于每个mmsi,我想计算连续时间戳之间差异的标准差。

我对SQL不是很有经验但是他们试图按如下方式构建一个函数:

SELECT 
mmsi, stddev(time_diff)
FROM
(SELECT mmsi,
 EXTRACT(EPOCH FROM (timestamp - lag(timestamp) OVER (ORDER BY mmsi ASC, timestamp ASC)))   
 FROM ais_messages.ais_static
 ORDER BY mmsi ASC, timestamp ASC) AS time_diff
 WHERE time_diff IS NOT NULL
GROUP BY mmsi;

1 个答案:

答案 0 :(得分:1)

您的查询看起来正确,但它有几个问题。您标记了子查询,看起来几乎正确,并使用您选择的别名。但是这个子查询返回多行和多列,所以这没有任何意义。这是一个更正版本:

SELECT 
    t.mmsi,
    STDDEV(t.time_diff) AS std
FROM
(
    SELECT
        mmsi,
        EXTRACT(EPOCH FROM (timestamp - LAG(timestamp) OVER
                (PARTITION BY mmsi ORDER BY timestamp))) AS time_diff 
    FROM ais_messages.ais_static
    ORDER BY mmsi, timestamp
) t
WHERE t.time_diff IS NOT NULL
GROUP BY t.mmsi

这种方法应该没问题,但有一个边缘情况,它可能不会按预期运行。如果给定的mmsi组只有一条记录,那么它甚至不会出现在标准偏差的结果集中。这是因为LAG计算会为该单条记录返回NULL,并且会将其过滤掉。