sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL verwijdert alle behalve de oudste records

Dit zou het moeten doen:

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;

Het creëert een afgeleide tabel die unieke nummers toekent aan elke combinatie van (adres, apparaatnaam, object-id) en de vroegste geeft (degene met de kleinste timestamp waarde) het nummer 1. Dan wordt dit resultaat gebruikt om al diegenen te verwijderen die het nummer 1 niet hebben. De virtuele kolom ctid wordt gebruikt om die rijen uniek te identificeren (het is een interne identificatie die door Postgres wordt geleverd).

Merk op dat voor het verwijderen van een heel groot aantal rijen, de aanpak van Erwin zeker sneller zal zijn.

SQLFiddle-demo:http://www.sqlfiddle.com/#!1/5d9fe/ 2



  1. MySQL bestellen voor voor groeperen op

  2. Hoe door de gebruiker gedefinieerde variabelen te gebruiken in de limietinstructie?

  3. Hoe leeftijd in jaren, maanden en dagen te krijgen met Oracle

  4. MySQL-fout:SELECT-lijst staat niet in GROUP BY-clausule