2017-11-26 15 views
1

ちょうどMAX(ts)に従ってテーブルからいくつかの列をフィルタリングしたいだけです。 ts = timestampSELECTとGROUP BY

SELECT deviceid, MAX(ts) 
FROM device_data 
GROUP BY deviceid 

と結果:

enter image description here

が、私はまた、2列以上必要 - 経度とlattitudeをデバイスIDとTS - 私は2つの列のみを選択した場合、すべてがOKです。私はGROUP BYで経度とlattitudeを挿入避けることができますどのように

enter image description here

:彼らはGROUP BYに表示されるように持っていると私は、同じデバイスIDを持つ、あまりにも多くの結果を得るために、私は経度とlattitudeを選択した場合、私は問題を抱えていますか?

+0

使用しているDBMSは何ですか? – Hadi

+0

どのデータベースですか?私は入れ子になったクエリが必要だと思っていますが、構文は使用するデータベースによって異なる場合があります。 –

+0

DBMSについての情報はありません。私はPostgreSQLを使用しています。 –

答えて

1

これにはいくつかの解決策があります。 1つは、降順で並べ替えると、同じdeviceidのパーティション内の最初の経度、緯度などを取得するウィンドウ関数を使用することです。

次にあなたがdistinctを削除することができ、重複を取得します:

SELECT DISTINCT deviceid, 
     FIRST_VALUE(longitude) OVER win AS longitude, 
     FIRST_VALUE(latitude) OVER win AS latitute, 
     FIRST_VALUE(ts) OVER win AS ts 
FROM device_data 
WINDOW win AS (PARTITION BY deviceid ORDER BY ts DESC); 
+0

こんにちは、私は上記のSELECT DISTINCTを実行しようとしていますが、最初にエラーが発生していますOVER:またはOVERの構文エラー –

+1

実行中のPostgreSQLのバージョンは? – trincot

+1

@DamianKowalewski:そのクエリでエラーが発生した場合は、Postgresを使用していないか、Postgres –

1

あなたは、その後、内側が希望を取得し、元のdevice_dataに参加するか、device_idあたりtsdevice_idとmaxを含むテーブルを作成することができます結果。

同じdevice_idmax(ts)の複数の行がある場合を除き、これは機能するはずです。

SELECT a.deviceid, a.ts, a.longitude, a.lattitude 
FROM device_data a 
INNER JOIN 
(SELECT deviceid, MAX(ts) as max_ts 
FROM device_data 
GROUP BY deviceid) b ON a.ts = b.max_ts 
GROUP BY 1,2,3,4; 
+0

作品:)非常に非常にありがとう:) –

+0

非常に非常に歓迎:) – penguin

+0

私はまた、SQLの他の科目で私を助けることができるように別の1つを作成します:) –