"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