sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLは最も古いレコードを除くすべてを削除します

    これでうまくいくはずです:

    delete from devices
    using (
       select ctid as cid, 
              row_number() over (partition by devicename, objectid order by timestamp asc) as rn
       from devices
    ) newest
    where newest.cid = devices.ctid
    and newest.rn <> 1;
    

    (アドレス、デバイス名、オブジェクトID)の各組み合わせに一意の番号を割り当て、最も早いもの(timestampが最小のもの)を与える派生テーブルを作成します。 値)数値1。次に、この結果を使用して、数値1を持たないものをすべて削除します。仮想列ctid これらの行を一意に識別するために使用されます(これはPostgresによって提供される内部識別子です)。

    非常に大量の行を削除する場合、Erwinのアプローチの方が間違いなく高速であることに注意してください。

    SQLFiddleデモ: http://www.sqlfiddle.com/#!1/5d9fe/ 2



    1. MySQL、テーブルファイルをコピーすると、エラー1017(HY000)が発生します:ファイルが見つかりません:ファイルがありますが

    2. どうすれば大量のmysqlテーブルを整理できますか?

    3. 集合体データテーブル

    4. Pythonを使用してBibTexファイルをデータベースエントリに変換する