2017-02-23 14 views
-1

Die Aufgabe, die ich versuche zu erreichen, ist das Folgende: Ich habe eine Tabelle mit zwei Spalten: - U0 und U1. Die Werte in den zwei Spalten werden manchmal wiederholt, was bedeutet, dass ein Wert sowohl in u0 als auch in u1 erscheinen würde.SQL :: Match doppelte Werte und verketten die Ergebnisse in einer durch Komma getrennten Zeichenfolge

  u0      u1  
1   A       B 
2   B       C 
3   D       B 
4   B       D 
5   F       E 

Wenn die Tabelle eine Zeile hat: U0 = A, u1 = B und eine weitere Zeile u0 = B, u1 = C, dann können wir, dass ein schließen, B und C gehören alle zu dem gleichen Benutzer. Die Idee besteht darin, eine Tabelle mit einer Spalte zu erstellen, in der jede Zeile eine Liste von U-Einträgen enthält, die zu einem Benutzer in einer durch Kommas getrennten Zeichenfolge gehören.

Desiered Ausgang:

 IDs 
u0 A,B,C,D 
u1 E,F,G 

Die Art, wie ich die Aufgabe genähert haben, ist mit den folgenden:

select 
    distinct 
    stuff(( 
     select ',' + u0 
     from [db1] 
     where u0 like u1 
     for xml path('') 
),1,1,'')as uids 
from [db1] 

Aber mit dieser Abfrage in BigQuery erhalte ich die Fehlermeldung:

Error: Encountered " "FOR" "for "" at line 7, column 9. Was expecting: ")" ...

Ich habe auch mit COALESCE versucht, aber ohne Erfolg

SELECT uids = COALESCE(u1 + ',','') + u0 
FROM [db1] 
WHERE u0 in u1 

und bekam diese Fehlermeldung zurück:

Error: Encountered " "IN" "in "" at line 3, column 12. Was expecting:

Vielen Dank im Voraus.

+0

Ihre Tabellenreferenz ist eindeutig Legacy BigQuery, also entfernte ich die unangemessenen Datenbanken. –

+0

Aktuelle Syntax: [String_agg] (https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#string_agg) ... Alte Syntax: [Group_concat] (https: // cloud.google.com/bigquery/docs/reference/legacy-sql#group_concat) – JohnHC

+0

Sie sollten GROUP_CONCAT sql Funktion verwenden, überprüfen Sie diesen Link http://stackoverflow.com/questions/42418641/split-row-results-to-column/ 42419232 # 42419232 –

Antwort

1

Ich glaube nicht, dass ich die Frage ganz verstehen, aber wenn Sie nur die String-Verkettung verschiedenen u0 Werte wollen bekommen, die in u1 sind, können Sie etwas tun:

#standardSQL 
SELECT 
    STRING_AGG(DISTINCT u0) 
FROM T 
WHERE u0 IN (SELECT u1 FROM T); 

Wie ein in sich geschlossenes Beispiel:

#standardSQL 
WITH T AS (
    SELECT * 
    FROM UNNEST(ARRAY<STRUCT<u0 STRING, u1 STRING>>[ 
    ('A', 'B'), 
    ('B', 'C'), 
    ('D', 'B'), 
    ('B', 'D'), 
    ('F', 'E') 
    ]) 
) 
SELECT 
    STRING_AGG(DISTINCT u0) 
FROM T 
WHERE u0 IN (SELECT u1 FROM T); 
+0

Danke für die Antwort Elliott. Als ich die erste vorgeschlagene Lösung ausprobierte, bekam ich eine einspaltige Tabelle zurück, die die Werte von u0 und u1 enthielt, aber nicht in einer durch Komma getrennten Zeichenkette, sondern jede Beobachtung in einem separaten Feld. Das zweite Beispiel ist nicht skalierbar, da ich 3 Millionen Beobachtungen habe. – Glaucon

Verwandte Themen