Jeden zweiten Datensatz löschen

Walter

Administrator
Teammitglied
Beiträge
494
In einer grossen Logging-Tabelle wurde das Logging-Intervall ursprünglich zu klein gewählt, jetzt soll einfach jeder zweite Datensatz gelöscht werden. Allerdings nicht global jeder zweite (dafür wüsste ich die Lösung) sondern jeder zweite Datensatz pro ID.

So sieht die Lösung nicht aus:
  • id 1 - erhalten
  • id 2 - löschen
  • id 3 - erhalten
  • id 4 - löschen

So muss die Lösung aussehen:
  • id 1, fk 1 - erhalten
  • id 2, fk 2 - erhalten
  • id 3, fk 1 - löschen
  • id 4, fk 1 - erhalten
  • id 5, fk 2 - löschen
Die Tabelle besteht also abgesehen von den Nutzdaten aus der fortlaufenden ID und einer zweiten ID die auf eine andere Tabelle verweist (devices, die in unterschiedlichen Intervallen loggen).
 
Werbung:
Du hast:

Code:
edb=# select * from walter ;
 id | fk
----+----
  1 |  1
  2 |  2
  3 |  1
  4 |  1
  5 |  2
(5 rows)

Löschen willst Du:

Code:
edb=*# with x as (select id, fk, row_number() over (partition by fk order by id) from walter order by id) select * from x where row_number%2 = 0;
 id | fk | row_number
----+----+------------
  3 |  1 |          2
  5 |  2 |          2
(2 rows)

nun denn:

Code:
edb=*# with x as (select id, fk, row_number() over (partition by fk order by id) from walter order by id) delete from walter where (id, fk) in (select id,fk from x where row_number%2 = 0);
DELETE 2
edb=*# select * from walter ;
 id | fk
----+----
  1 |  1
  2 |  2
  4 |  1
(3 rows)

edb=*#
 
Zurück
Oben