2017-07-11 18 views
0

ためSTDDEVを計算Iは、ID列を持つテーブルを持っているがMMSIごとに複数のタイムスタンプと、MMSIタイムスタンプの別の列と呼ばれます。PostgreSQLの行差分タイムスタンプ、およびグループ

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

あなたのクエリは、右のトラックに見えますが、それはいくつかの問題があります。右に表示されるサブクエリに、別名を付けてラベルを付けました。しかし、このサブクエリは複数の行と列を返すため、これは意味をなさない。ここに修正バージョンがあります:

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グループに1つのレコードしかない場合、それは標準偏差の結果セットに現れません。これは、LAGの計算でその単一のレコードに対してNULLが返され、それが除外されるためです。

関連する問題