Doppelte Einträge finden, wobei sich Spalten verschieben können.

Hallo,

hier mal ein Beispiel einer Tabelle als Basis um mein Problem darzustellen.

zB. eine Person-Table mit id, firstname und lastname jeweils als Spalte. In Wirklichkeit ist das ganze natürlich wesentlich komplexer. Aber fürs Beispiel reicht das mal.

Einfache doppelte Einträge herausfinden ist kein Thema. Meine Problematik geht dahin, dass firstname und lastname auch vertauscht werden können. Dh. eine Zeile mit firstname = ‘Hugo’, lastname = ‘Boss’ und eine weitere Zeile mit firstname = ‘Boss’, lastname = ‘Hugo’ sollte als doppelter Eintrag erkannt werden und beide Ids sollen ausgegeben werden. Wenn möglich noch in einer Zeile.

Also das mit einer Zeile bekomme ich ja noch hin.

SELECT p.lastname, array_to_string(array_accum(DISTINCT p.id), ',') as ids 
FROM person p
GROUP BY p.lastname
HAVING COUNT(DISTINCT p.id) > 1

Das gibt zB. folgendes aus:

[TABLE]
[TR]
[/TR]
[TR=“class: data1”]
[TD]Aabo[/TD]
[TD]23919,123521[/TD]
[/TR]
[TR=“class: data2”]
[TD]Aakervik[/TD]
[TD]41987,144557[/TD]
[/TR]
[TR=“class: data1”]
[TD]Aalam Samimi[/TD]
[TD]56949,133541,133542,133543,133544[/TD]
[/TR]
[TR=“class: data2”]
[TD]Aalberg[/TD]
[TD]21866,145776[/TD]
[/TR]
[TR=“class: data1”]
[TD]Aalto[/TD]
[TD]56398,155089[/TD]
[/TR]
[TR=“class: data2”]
[TD]Aamdal[/TD]
[TD]1001,85368,85369,85370,85371,85372,85373,85374,85375,85376,85377,85378,85379,85380,85381,85382[/TD]
[/TR]
[/TABLE]

Wobei ich normalerweise den lastname weglasse. Hier haben zB. alle mit der rechts stehenden Id den selben lastname.

Im Grouping gebe ich dann immer an, ob eben nur nach lastname “quasi” verglichen wird oder auch noch andere Spalten, wie zB. firstname herangezogen wird.

Jetzt fehlt mir aber irrgendwie der Ansatz, um eben die Spalten zu verschieben, tauschen, kombinieren, was auch immer und zuvor beschriebene Datensätze auch als mehrfach zu erkennen.

Hoffe ich konnte meine Problematik verständlich darstellen und hoffe auch, es kann mir wer helfen.

Vorweg mal, wenn es nicht anders geht, mach ich auch zwei Querys draus…

Danke
Gruß MarioMan



test=# select * from p;
 id | firstname |  lastname
----+-----------+------------
  1 | hugo      | boss
  2 | boss      | hugo
  3 | andreas   | kretschmer
  4 | vorname   | nachname
  5 | nachname  | vorname
(5 rows)

test=# select case when firstname > lastname then firstname||lastname else lastname||firstname end, array_agg(id) from p where (case when firstname > lastname then firstname||lastname else lastname||firstname end) in (select case when firstname > lastname then firstname||lastname else lastname||firstname end from p group by 1 having count(*) > 1) group by 1;
      case       | array_agg
-----------------+-----------
 hugoboss        | {1,2}
 vornamenachname | {4,5}
(2 rows)

So?


Andreas