PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL usuwa wszystkie rekordy oprócz najstarszych

To powinno wystarczyć:

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;

Tworzy tabelę pochodną, ​​która przypisze unikalne numery do każdej kombinacji (adres, nazwa urządzenia, identyfikator obiektu) podając najwcześniejszą (tę z najmniejszym timestamp wartość) liczba 1. Następnie ten wynik jest używany do usunięcia wszystkich tych, które nie mają liczby 1. Wirtualna kolumna ctid służy do jednoznacznej identyfikacji tych wierszy (jest to wewnętrzny identyfikator dostarczany przez Postgres).

Zauważ, że w przypadku usunięcia naprawdę dużej liczby wierszy podejście Erwina z pewnością będzie szybsze.

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przyznać uprawnienia do przyszłych tabel w PostgreSQL?

  2. Jak działa current_time w PostgreSQL

  3. Korzystanie z wielu baz danych i schematów POSTGRES z tym samym modelem Flask-SQLAlchemy

  4. Skalowanie połączeń w PostgreSQL przy użyciu puli połączeń

  5. Sekwencjonuj błąd ładowania Chętnego podczas dołączania powiązanego modelu