2010-09-13 4 views
12

So habe ich 5 Zeilen wie diesemehrere Zeilen in einem Raum getrennt String Kombinieren

userid, col 
-------------- 
1, a 
1, b 
2, c 
2, d 
3, e 

Wie würde ich Abfrage tun, damit es wie diese

userid, combined 
1, a b 
2, c d 
3, e 
+0

Fast exakte Kopie von: http://stackoverflow.com/questions/2885709/sql-concatenate-rows-query –

Antwort

13

Verwenden Sie die GROUP_CONCAT aggregate function aussehen:

SELECT yt.userid, 
     GROUP_CONCAT(yt.col SEPARATOR ' ') AS combined 
    FROM YOUR_TABLE yt 
GROUP BY yt.userid 

Das Standardtrennzeichen ist ein Komma (","), so dass Sie den SEPARATOR eines einzelnen Platzes angeben müssen die Ausgabe, die Sie wünschen.

Wenn Sie die Reihenfolge der Werte in der GROUP_CONCAT sicherstellen wollen, verwenden Sie:

SELECT yt.userid, 
     GROUP_CONCAT(yt.col ORDER BY yt.col SEPARATOR ' ') AS combined 
    FROM YOUR_TABLE yt 
GROUP BY yt.userid 
+0

Ich bin verwende ich jetzt Hive, also kann ich die Gruppe für Teile nicht tun, weil GROUP_CONCAT nicht als Aggregationsfunktion erkannt wird, egal um welche herum? – haoxu

+0

@haoxu: Die nächste Option (aus einer SQL-Perspektive) wäre eine Cursor- und String-Verkettung, aber es würde eine MySQL-Funktion erfordern. Ich bin nicht vertraut mit Hive - gibt es keine Möglichkeit, eine native Abfrage zu verwenden? –

+1

Eine JIRA-Anfrage für GROUP_CONCAT in HiveQL abgelegt: https://issues.apache.org/jira/browse/HIVE-1689 –

-6

Ich bin ziemlich sicher, dass Sie dies mit Hive QL nicht tun können. Dies sollte jedoch möglich sein, wenn Sie eigene Map/Reduce-Skripte schreiben - siehe this tutorial, um loszulegen.

+0

Antwort ist veraltet. Neuere Versionen haben die Funktionen. –

41

Im Bienenstock können Sie verwenden

SELECT userid, collect_set(combined) FROM tabel GROUP BY user_id; 

collect_set duplizierten entfernt. Wenn Sie sie behalten möchten, können Sie diesen Beitrag überprüfen:

COLLECT_SET() in Hive, keep duplicates?

+1

genau was ich wollte! funktioniert wie ein Zauber, um eine Reihe aus einer Gruppe nach Abfrage zu erstellen –

2
SELECT 
    userid, 
    concat_ws(" ", collect_set(col)) AS combined 
FROM table 
GROUP BY userid 
Verwandte Themen