sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL sletter alle undtagen de ældste poster

Dette burde gøre 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;

Det opretter en afledt tabel, der vil tildele unikke numre til hver kombination af (adresse, enhedsnavn, objekt-id), der giver den tidligste (den med det mindste timestamp værdi) tallet 1. Så bruges dette resultat til at slette alle dem, der ikke har tallet 1. Den virtuelle kolonne ctid bruges til entydigt at identificere disse rækker (det er en intern identifikator leveret af Postgres).

Bemærk, at for at slette en rigtig stor mængde rækker, vil Erwins tilgang helt sikkert være hurtigere.

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



  1. Skal jeg håndtere et GraphQL ID som en streng på klienten?

  2. Hvad betyder Overhead i MySQL, hvad er dårligt ved det, og hvordan løser man det?

  3. Ydeevnen øges ikke, selv øget work_mem-størrelsen

  4. Postgis installation:type geometri eksisterer ikke