sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL odstraní všechny záznamy kromě nejstarších

Mělo by to stačit:

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;

Vytvoří odvozenou tabulku, která každé kombinaci (adresa, název zařízení, id objektu) přiřadí jedinečná čísla, přičemž se získá ta nejstarší (ta s nejmenším timestamp hodnota) číslo 1. Potom se tento výsledek použije k odstranění všech, které nemají číslo 1. Virtuální sloupec ctid se používá k jednoznačné identifikaci těchto řádků (je to interní identifikátor dodávaný společností Postgres).

Všimněte si, že pro mazání opravdu velkého množství řádků bude Erwinův přístup zcela jistě rychlejší.

Ukázka SQLFiddle:http://www.sqlfiddle.com/#!1/5d9fe/ 2



  1. Jak nastavit smyčku WHILE s příkazem IF v MySQL?

  2. Jak vybrat data, kde má pole v MySQL minimální hodnotu?

  3. sql - seskupit podle v rozsazích pro zahrnutí rozsahů bez hodnot

  4. [AKTUALIZOVÁNO 2020-01-23] Microsoft Office 365 Build 1912 porušuje identitu propojených tabulek ODBC