2017-07-10 9 views
0

Wie wählt man aus zwei Spalten, so dass jeder Wert nur einmal gesehen wird?Postgres wählen distinct des kartesischen Produkts

Zum Beispiel. Aus dieser Tabelle:

Column A        Column B 
------------------------------------------------------------------------- 
02131d36-06cc-408e-9e40-1de65fbf37f4 7495fc05-e244-426c-bdae-a5ee121be510 
11c32339-1b77-46e1-9215-0b1d4ec0b1d3 7495fc05-e244-426c-bdae-a5ee121be510 
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1 
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 7495fc05-e244-426c-bdae-a5ee121be510 
94e66d74-f0ce-472b-ad68-a98e267038b8 7495fc05-e244-426c-bdae-a5ee121be510 
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1 
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 7495fc05-e244-426c-bdae-a5ee121be510 
94e66d74-f0ce-472b-ad68-a98e267038b8 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1 
02131d36-06cc-408e-9e40-1de65fbf37f4 c597af82-58d5-4630-87e5-939898cc68ed 
11c32339-1b77-46e1-9215-0b1d4ec0b1d3 c597af82-58d5-4630-87e5-939898cc68ed 
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 c597af82-58d5-4630-87e5-939898cc68ed 
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 c597af82-58d5-4630-87e5-939898cc68ed 
94e66d74-f0ce-472b-ad68-a98e267038b8 c597af82-58d5-4630-87e5-939898cc68ed 

Ziehen Sie diese (beide A und B verschieden):

02131d36-06cc-408e-9e40-1de65fbf37f4 7495fc05-e244-426c-bdae-a5ee121be510 
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1 
94e66d74-f0ce-472b-ad68-a98e267038b8 c597af82-58d5-4630-87e5-939898cc68ed 

Ich weiß, dass es ein paar Kombinationen möglich ist, möchte ich jede einer von ihnen, aber nicht alle von ihnen .

Die Tabelle wird von einer Untergruppe von kartesisches Produkt der unterschiedlichen Werte von B und verschiedene Werte von A.

Ich habe einzumischen mit Fensterfunktionen und die Gruppe durch die gemacht und habe es noch nicht bekommen zu arbeiten.

+0

Ich würde vielleicht DISTINCT ON überprüfen. – jarlh

+2

wo ist '39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2' und '11c32339-1b77-46e1-9215-0b1d4ec0b1d3' aus Ihrer Spalte A? Ich erwarte mehr Datensätze. oder liege ich falsch? –

+0

Oh, da war eine dritte Spalte und sie wurden weggefiltert! Ich hätte sagen sollen, es ist nur eine Teilmenge eines kartesischen Produkts. – Eric

Antwort

3

mit Fensterfunktionen:

t=# create table so182(a text,b text); 
CREATE TABLE 
Time: 23.926 ms 
t=# copy so182 from stdin delimiter ' '; 
t=# select distinct first_value(a) over (partition by b),b from so182; 
      first_value    |     b 
--------------------------------------+-------------------------------------- 
02131d36-06cc-408e-9e40-1de65fbf37f4 | 7495fc05-e244-426c-bdae-a5ee121be510 
11c32339-1b77-46e1-9215-0b1d4ec0b1d3 | c597af82-58d5-4630-87e5-939898cc68ed 
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 | 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1 
(3 rows) 

verschieden auf:

t=# select distinct on (b) b,a from so182; 
        b     |     a 
--------------------------------------+-------------------------------------- 
7495fc05-e244-426c-bdae-a5ee121be510 | 02131d36-06cc-408e-9e40-1de65fbf37f4 
7b9fb1b0-61d4-4424-af83-33b1b7e77bc1 | 39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 
c597af82-58d5-4630-87e5-939898cc68ed | 11c32339-1b77-46e1-9215-0b1d4ec0b1d3 
(3 rows) 

Time: 0.263 ms 
+1

Wie wäre es mit '94e66d74-f0ce-472b-ad68-a98e267038b8' und 'ab8130c7-e6a3-46cc-9ebc-0f8aca698169' - diese Datensätze werden verloren gehen - wenn Sie versuchen, ein kartesisches Produkt mit dem Ergebnis zu tun, wird es nicht seien Sie die gleichen Daten wie es vor –

+1

war, wenn ich OP verstehe, JEDE Reihe A bedeutet, dass wir irgendeinen wollen, so wird der Rest verloren sein und das wird gewollt. Vielleicht habe ich den Beitrag nicht verstanden? .. –

+0

yep, die Frage ist nicht ganz klar –

-1

Sorry, kann ich jetzt nicht überprüfen, ob es funktioniert, aber wie etwa:

  1. 2 Erstellen von temporären Tabellen wie:

    CREATE TABLE #ColumnA(id int NOT NULL AUTO_INCREMENT, columna varchar(30)) 
    CREATE TABLE #ColumnB(id int NOT NULL AUTO_INCREMENT, columnb varchar(30)) 
    
  2. Füllen sie wie:

    INSERT INTO ColumnA SELECT DISTINCT columna FROM OriginalTable 
    INSERT INTO ColumnB SELECT DISTINCT columnb FROM OriginalTable 
    
  3. Joining:

    SELECT a.columna, b.columnb FROM ColumnA a OUTER JOIN ColumnB b ON a.id = b.id 
    

Es ist nicht recht ist, sollte aber funktionieren. In Punkt 1 habe ich Tabellennamen mit # geschrieben - es scheint, temporäre Tabellen zu erstellen. Auch AUTO_INCREMENT könnte in verschiedenen dbms unterschiedlich sein (in postgres "id serial" ist genug für diese Spalte). Ich kann es später überprüfen, wenn es keine besseren Antworten gibt.

Verwandte Themen