2016-12-28 9 views
1

私は、タイムスタンプの列とID(数値)の列を持つテーブルを持っているとしましょう。 IDごとに、最新のタイムスタンプを持つ行以外のすべての行を削除しようとしています。ここで PostgreSQL:最新のタイムスタンプを持つレコードを削除する

は、私がこれまで持っているコードです:

DELETE FROM table_name t1 
WHERE EXISTS (SELECT * FROM table_name t2 
WHERE t2."ID" = t1."ID" 
AND t2."LOCAL_DATETIME_DTE" > t1."LOCAL_DATETIME_DTE") 

このコードが動作しているようですが、私の質問は:なぜそれが>記号ではなく、タイムスタンプの比較で<サインですか?これは、別の行より後のタイムスタンプを持つすべての行の削除を選択していませんか?私はこのコードが各IDの最も早いタイムスタンプを持つ行だけを保持すると思った。

答えて

0

あなたは、レコードが大きく、これ>、タイムスタンプを見つけることができるのレコードを削除するEXISTS演算子を使用しています。最新の場合は、タイムスタンプの高いレコードがないため、句はtrueに解決されないため、レコードは保持されます。

+0

説明をありがとう! – CoteDor

0

あなたはタプルを一致させるために「記録」の擬似タイプを使用することができます。

DELETE FROM table_name 
WHERE (ID,LOCAL_DATETIME_DTE) not in 
(SELECT ID,max(LOCAL_DATETIME_DTE) FROM table_name group by id); 
+0

このようなやり方をしていただきありがとうございます。 – CoteDor

関連する問題