2016-10-14 3 views
0

ich eine PostgreSQL-Tabelle, die Benutzerdaten speichern Benutzer aufgerufen, wie untenPostgres: Löschen von Zeilen, die in einer Spalte auf der Grundlage der Bedingungen einer anderen Spalte dupliziert werden

gezeigt
ID | user name  | item | dos  | Charge| 
1 |  Ed   | 32 |01-02-1987| 1  | 
2 |   Taya |  01 |05-07-1981|-1  | 
3 |   Damian |  32 |22-19-1990| 1  | 
2 |   Taya |  01 |05-07-1981| 1  | 
2 |   Taya |  01 |05-07-1981| 1  | 
1 |    Ed |  32 |01-02-1987|-1  | 

Ich mag Zeilen löschen, wo sie gleich sind across id, username, item und dos & Summe der Gebühren ist 0. Dies bedeutet, dass sowohl Zeile 1 als auch Zeile 6 für ed gelöscht wird.

Bei mehr als 2 Vorkommen, wenn die Summe der Ladung 1 ist, möchte ich eine der Zeile mit Ladung -1 und 1 gelöscht, was bedeutet, dass eine Zeile mit Ladung 1 beibehalten wird. Zum Beispiel: ROw 2 und Row für Taya werden gelöscht.

Die Ausgabetabelle, die ich bin nach its:

ID | user name  | item | dos  | Charge| 
3 |   Damian |  32 |22-19-1990| 1  | 
2 |   Taya |  01 |05-07-1981| 1  | 

Irgendwelche Ideen?

Antwort

2

Sie wollen die having Klausel:

Dies wird Ihnen die Ausgabe Sie erhalten:

select 
    id, user_name, item, dos, sum (charge) 
from table 
group by 
    id, user_name, item, dos 
having 
    sum (charge) != 0 

Wenn Sie wirklich versuchen, die Datensätze zu löschen, die es Null machen:

delete from table 
where (id, user_name, item, dos) in (
    select id, user_name, item, dos 
    from table 
    group by id, user_name, item, dos 
    having sum (charge) = 0 
) 

Dies macht das gleiche und ist ein bisschen mehr Code, aber weil es einen Semi-Join verwendet, könnte es für wirklich große Datensätze besser sein:

with delete_me as (
    select id, user_name, item, dos 
    from table 
    group by id, user_name, item, dos 
    having sum (charge) = 0 
) 
delete from table t 
where exists (
    select null 
    from delete_me d 
    where 
    t.id = d.id and 
    t.user_name = d.user_name and 
    t.item = d.item and 
    t.dos = d.dos 
) 
+0

@ hamone ... Danke, es funktioniert: - – Geethurv

+0

@Geethurv - Ich bin froh, dass es geklappt hat. Wenn eine Lösung Ihren Anforderungen entspricht, achten Sie darauf, dass sie als akzeptiert gilt. Auf diese Weise werden zukünftige Benutzer ein ähnliches Problem haben und wissen, dass es eine praktikable Lösung gibt – Hambone

Verwandte Themen