sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL raderar alla utom de äldsta posterna

Detta borde göra det:

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;

Den skapar en härledd tabell som kommer att tilldela unika nummer till varje kombination av (adress, enhetsnamn, objekt-id) som ger den tidigaste (den med den minsta timestamp värde) talet 1. Sedan används detta resultat för att ta bort alla de som inte har siffran 1. Den virtuella kolumnen ctid används för att unikt identifiera dessa rader (det är en intern identifierare som tillhandahålls av Postgres).

Observera att för att radera en riktigt stor mängd rader kommer Erwins tillvägagångssätt definitivt att vara snabbare.

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



  1. symfony 1.4 propel:build-all fungerar inte på Mysql 5.5

  2. MYSQL välj gemensamma vänner

  3. Ändra dynamiskt kolumnnamn i PDO-satsen

  4. SQLite-kommandon