Re: "Fast" doppelte Einträge aussortieren

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

In response to

Responses

Browse pgsql-de-allgemein by date

  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