From: | Tim Landscheidt <tim(at)tim-landscheidt(dot)de> |
---|---|
To: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: "Fast" doppelte Einträge aussortieren |
Date: | 2010-05-28 21:30:21 |
Message-ID: | m3wrunr9xu.fsf@passepartout.tim-landscheidt.de |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-de-allgemein |
Nicola Tiling <nti(at)w4w(dot)net> wrote:
> Und jetzt komme ich um die Funktionen wohl doch nicht drumherum ...
Doch, doch, das geht schon.
> Ich habe folgendes Problem und weiß nicht wie ich ihm zu Leibe rücken soll.
> In einer Tabelle die extern automatisch mit Daten gefüttert wird, sind für mich manche Einträge überflüssig wenn Sie in Spalte B doppelt sind UND in Spalte C leer. Konkret
> id ip mac
> 1 192.168.14.30
> 2 192.168.14.253
> 3 192.168.14.254
> 4 192.168.160.1 000e0ca2a2f1
> 5 192.168.160.1
> 6 192.168.160.10
> 7 192.168.160.11 003048b10d4d
> 8 192.168.160.11
> Für meine Belange sind ID 4 und 5 sowie 7 und 8 doppelt weil sie die gleiche IP Nummer haben. WENN dem so ist benötige ich den Datensatz mit der mac-Adresse.
> Also "Wenn Wert in Spalte ip doppelt, gebe Datensatz aus der auch einen Wert in Spalte mac hat".
> D.h. heißt eine Abfrage soll nur die Datensätze 1,2,3,4,6,7 zurückgeben. Ein "DISTINCT ON (ip)" reicht nicht aus, weil damit nicht sichergestellt ist, dass ich den Datensatz mit der mac-Adresse erwische.
Dafür musst Du die "ORDER BY"-Reihenfolge so wählen, dass
die Zeilen mit der MAC-Adresse an die erste Stelle sortiert
werden:
| tim=# SELECT DISTINCT ON (IP) ID, IP, MAC FROM TestTable ORDER BY IP, MAC DESC;
| id | ip | mac
| ----+----------------+--------------
| 2 | 192.168.14.253 |
| 3 | 192.168.14.254 |
| 1 | 192.168.14.30 |
| 4 | 192.168.160.1 | 000e0ca2a2f1
| 6 | 192.168.160.10 |
| 7 | 192.168.160.11 | 003048b10d4d
| (6 Zeilen)
| tim=#
Falls Du "leere" MAC-Adressen als NULLs speicherst, er-
reichst Du die richtige Sortierung durch "ORDER BY IP, MAC
NULLS LAST".
Wenn Du die ID-Spalte nicht benötigst, kannst Du natürlich
auch:
| tim=# SELECT IP, MAX(MAC) FROM TestTable GROUP BY IP;
| ip | max
| ----------------+--------------
| 192.168.14.254 |
| 192.168.160.1 | 000e0ca2a2f1
| 192.168.160.11 | 003048b10d4d
| 192.168.160.10 |
| 192.168.14.253 |
| 192.168.14.30 |
| (6 Zeilen)
| tim=#
verwenden. Diese Variante ist für NULL und "leere" MAC-Zei-
chenketten identisch.
Tim
From | Date | Subject | |
---|---|---|---|
Next Message | Nicola Tiling | 2010-05-28 21:37:54 | Re: "Fast" doppelte Einträge aussortieren |
Previous Message | Nicola Tiling | 2010-05-28 20:36:20 | "Fast" doppelte Einträge aussortieren |