Duplicate innerhalb eine Gruppe löschen

Hi,

Wie ich alle Duplikate einer ganzen Tabelle mithilfe einer Window-function löschen kann weiß ich.
Aber wie kann ich beispielsweise alle Duplikate pro User löschen, also bei jedem User für sich?

vielen Dank für eure Hilfe
Jayni

Mit Window-Funktion je User zählen? row_number() over (partition by user_id) oder so?

Ja hab ich auch überlegt, aber dann brauch ich zwei Window funktionen ineinander und ich weiß nicht wie das gehen soll.
Ich müsste ja die Window funktion auf jeden Benutzter für sich anwenden.
Ich kann in der FROM clause doch nicht mehrere Gruppen angeben.

Schnellschuß aus der Hüfte:

test=*# select * from jayni ;
 user_id | val
---------+-----
       1 |   1
       1 |   2
       1 |   3
       1 |   2
       1 |   3
       2 |   1
       2 |   1
       2 |   1
       2 |   2
(9 rows)

Time: 0,145 ms
test=*# select * from (select *, row_number() over (partition by user_id, val), ctid from jayni) foo where row_number > 1 ;
 user_id | val | row_number | ctid
---------+-----+------------+-------
       1 |   2 |          2 | (0,2)
       1 |   3 |          2 | (0,3)
       2 |   1 |          2 | (0,7)
       2 |   1 |          3 | (0,8)
(4 rows)

Time: 0,374 ms
test=*# delete from jayni where ctid in (select ctid from (select *, row_number() over (partition by user_id, val), ctid from jayni) foo where row_number > 1) ;
DELETE 4
Time: 5,730 ms
test=*# select * from jayni ;
 user_id | val
---------+-----
       1 |   1
       1 |   2
       1 |   3
       2 |   1
       2 |   2
(5 rows)

Ohman danke!

So simple, Ich bin garnicht darauf gekommen die einfach nach zwei Kriterien zu partitionieren, sondern hab viel komplizierter gedacht

Jayni