"Fast" doppelte Einträge aussortieren

"Fast" doppelte Einträge aussortieren

am 28.05.2010 22:36:20 von Nicola Tiling

Hi

Und jetzt komme ich um die Funktionen wohl doch nicht drumherum ...

Ich habe folgendes Problem und weiß nicht wie ich ihm zu Leibe rücken s=
oll.=20

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 si=
nd UND in Spalte C leer. Konkret

id ip mac

1 192.168.14.30
2 192.168.14.253 =09
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=09


Für meine Belange sind ID 4 und 5 sowie 7 und 8 doppelt weil sie die glei=
che IP Nummer haben. WENN dem so ist benötige ich den Datensatz mit der m=
ac-Adresse.

Also "Wenn Wert in Spalte ip doppelt, gebe Datensatz aus der auch einen Wer=
t in Spalte mac hat".

D.h. heißt eine Abfrage soll nur die Datensätze 1,2,3,4,6,7 zurückgeb=
en. Ein "DISTINCT ON (ip)" reicht nicht aus, weil damit nicht sichergestell=
t ist, dass ich den Datensatz mit der mac-Adresse erwische.

Es ist ausgeschlossen das eine IP mehr als zweimal vorkommen kann. Es ist =
auch immer so, das wenn eine IP zweimal vorkommt einmal die Spalte mac leer=
ist und einmal einen Inhalt hat. (Hintergrund ist das ein physikalische Ne=
tzwerkinterface auf dem VLANs oder andere virtuelle Interfaces liegen einma=
l ohne MacAdresse erfasst wird - warum auch immer.)

Hat jmd. vielleicht eine Idee?

Grüße
Nicola



--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: "Fast" doppelte Einträgeaussortieren

am 28.05.2010 23:30:21 von Tim Landscheidt

Nicola Tiling 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ück=
en soll.

> In einer Tabelle die extern automatisch mit Daten gefüttert wird, sin=
d für mich manche Einträge überflüssig wenn Sie in Spalte B doppe=
lt 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üc=
kgeben. Ein "DISTINCT ON (ip)" reicht nicht aus, weil damit nicht sicherg=
estellt 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=3D# 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=3D#

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=3D# 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=3D#

verwenden. Diese Variante ist für NULL und "leere" MAC-Zei-
chenketten identisch.

Tim


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: "Fast" doppelte Einträge aussortieren

am 28.05.2010 23:37:54 von Nicola Tiling

Ahoi

> | tim=3D# SELECT DISTINCT ON (IP) ID, IP, MAC FROM TestTable ORDER BY IP,=
MAC DESC;

Genau das hatte ich auch probiert, allerdings ohne das gewünschte Ergebni=
s - wohl wegen dem NULL Wert

> Falls Du "leere" MAC-Adressen als NULLs speicherst, er-
> reichst Du die richtige Sortierung durch "ORDER BY IP, MAC
> NULLS LAST".

Denn - das wars! Hab Dank.

Grüße
Nicola
--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: "Fast" doppelte Einträgeaussortieren

am 28.05.2010 23:50:19 von Olaf Radicke

Kann man das nicht durch eine Tabellenänderung und die Art der Speicherun=
g=20
darin ändern? Nur mal so als Brainstorming:

Wenn ich die IP als primary key benutze und in einer zweiten tabelle die IP=
=20
als Fremdschlüssel für die mac-adresse benutze, müsste ich beim speic=
hern=20
fragen: Ist IP schon vorhanden, dann UPDATE wenn nicht INSERT. Habe ich ein=
e=20
mac, dann speichern in zweiter Tabelle. So habe ich erst gar kein Datenschr=
ott=20
in der DB.

Gruß

Olaf

--=20
Meine Rechtschreibfehler stehen unter der Creative Commons Lizenz.
(Bearbeitungen und Weitergabe unter gleichen Bedingungen):
http://creativecommons.org/licenses/by-sa/3.0/de/

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: "Fast" doppelte Einträge aussortieren

am 29.05.2010 00:39:44 von Nicola Tiling

Hi

Am 28.05.2010 um 23:50 schrieb Olaf Radicke:

> Kann man das nicht durch eine Tabellenänderung und die Art der Speicher=
ung=20
> darin ändern?

Nee leider nicht. Die Daten werden von dem Netzwerk Monitoringsystem "OpenN=
MS" generiert. Da kann ich nichts ändern.

Grüße
Nicola
--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: "Fast" doppelte Einträgeaussortieren

am 31.05.2010 01:39:09 von Tim Landscheidt

Nicola Tiling wrote:

>> | tim=3D# SELECT DISTINCT ON (IP) ID, IP, MAC FROM TestTable ORDER BY =
IP, MAC DESC;

> Genau das hatte ich auch probiert, allerdings ohne das gewünschte Erg=
ebnis - wohl wegen dem NULL Wert

>> Falls Du "leere" MAC-Adressen als NULLs speicherst, er-
>> reichst Du die richtige Sortierung durch "ORDER BY IP, MAC
>> NULLS LAST".

> Denn - das wars! Hab Dank.

Wobei ich mich etwas korrigieren muss: Natürlich würde auch
"ORDER BY IP, MAC" reichen.

Tim


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein