2016-07-11 11 views
0

Ich verwende LISTAGG Funktion des Redshift zu Gruppentabellen durch Paare:Wie Rotverschiebung des LISTAGG verwenden erstellen

SELECT id, LISTAGG(data, ', ') FROM ... GROUP BY 1; 

Dieser wandelt Tabellen wie:

1 "data_A" 
1 "data_B" 
2 "data_C" 
2 "data_D" 

An:

1 "data_A, data_B" 
2 "data_C, data_D" 

Dies bedeutet jedoch, dass wir immer noch zwei Spalten haben, aber es wäre schön, drei Spalten aus der Daten:

1 "data_A" "data_B" 
2 "data_C" "data_D" 

Angenommen, wir wissen, dass wir nur zwei Artikel pro ID haben können, kann eine solche drei Säulenschema in Redshift implementiert werden, LISTAGG oder eine andere Funktion Kombination? Als zusätzlichen Bonus können wir die Daten in den Spalten sortieren, so dass die Daten in der linken Spalte kleiner sind als die Daten in der rechten Spalte?

Antwort

1

Anstelle von listagg() können Sie einfach Aggregation verwenden. Weil Sie zwei Werte wollen, min() und max() Arbeit:

SELECT id, MIN(data), MAX(data) 
FROM ... 
GROUP BY 1; 

Wenn Sie nur einen Wert für eine gegebene id haben könnte, können Sie Phrase dies als:

SELECT id, MIN(data), 
     (CASE WHEN MIN(data) <> MAX(data) THEN MAX(data) END) 
FROM ... 
GROUP BY 1; 

Dieses setzt NULL in die dritte Spalte , wenn es nur einen Wert für data gibt.

+0

Vielen Dank! habe diese Option vergessen. – nbubis

Verwandte Themen