2017-11-24 4 views
1

Ich habe diese Daten in TabelleAbfrage mit Agregate und Zustand ohne join (BigQuery Standard-SQL)

column 1 column 2 condition value 
1 ABC 1 1 
1 строка 2 0 1 
1 строка 3 0 1 
1 строка 4 0 1 
1 строка 5 0 1 
1 строка 6 0 1 
2 BCD 1 1 
2 строка 2 0 1 
2 строка 3 0 1 

Und ich werde nicht um dieses Ergebnis haben:

column 1 column 2 sum of value 
1 ABC 6 
2 BCD 3 

Dieses Ergebnis wird durch die erste gruppiert nur Spalte. Die zweite Spalte zeigt die Werte, die sich auf den Zeilen befinden, an denen die Bedingung 1 ist. In der dritten Spalte erhalten wir die Summe über dem Spaltenwert, ohne Bedingungen. Ist es möglich, dies ohne beitreten zu tun (weil Tabelle sehr groß)

Antwort

4

Below für SQL BigQuery Norm ist

#standardSQL 
SELECT 
    column1, 
    MAX(IF(condition = 1, column2, '')) column2, 
    SUM(value)sumOfValue 
FROM `project.dataset.table` 
GROUP BY column1 

Sie testen können/mit ihm spielen Beispiel aus Ihrer Frage verwenden, wie unten

#standardSQL 
WITH `project.dataset.table` AS (
    SELECT 1 column1, 'ABC' column2, 1 condition, 1 value UNION ALL 
    SELECT 1,   'строка 2',  0,   1 UNION ALL 
    SELECT 1,   'строка 3',  0,   1 UNION ALL 
    SELECT 1,   'строка 4',  0,   1 UNION ALL 
    SELECT 1,   'строка 5',  0,   1 UNION ALL 
    SELECT 1,   'строка 6',  0,   1 UNION ALL 
    SELECT 2,   'BCD',   1,   1 UNION ALL 
    SELECT 2,   'строка 2',  0,   1 UNION ALL 
    SELECT 2,   'строка 3',  0,   1 
) 
SELECT 
    column1, 
    MAX(IF(condition = 1, column2, '')) column2, 
    SUM(value)sumOfValue 
FROM `project.dataset.table` 
GROUP BY column1 

Das Ergebnis ist wie erwartet (ich glaube)

column1 column2 sumOfValue 
1  ABC  6  
2  BCD  3  

Die obige Lösung setzt voraus, dass Sie nur eine Zeile mit Bedingung = 1 pro Gruppe von Spalte1 haben. Wenn dies nicht der Fall ist, erhalten Sie oben nur einen (MAX) Wert von Spalte2. Wenn Sie alle diese Werte zu gruppieren müssen - siehe Option unter

#standardSQL 
WITH `project.dataset.table` AS (
    SELECT 1 column1, 'ABC' column2, 1 condition, 1 value UNION ALL 
    SELECT 1,   'строка 2',  0,   1 UNION ALL 
    SELECT 1,   'строка 3',  1,   1 UNION ALL 
    SELECT 1,   'строка 4',  0,   1 UNION ALL 
    SELECT 1,   'строка 5',  1,   1 UNION ALL 
    SELECT 1,   'строка 6',  0,   1 UNION ALL 
    SELECT 2,   'BCD',   1,   1 UNION ALL 
    SELECT 2,   'строка 2',  0,   1 UNION ALL 
    SELECT 2,   'строка 3',  0,   1 
) 
SELECT 
    column1, 
    REGEXP_REPLACE(STRING_AGG(IF(condition = 1, CONCAT(column2, ','), ''),''), r',$', '') column2, 
    SUM(value)sumOfValue 
FROM `project.dataset.table` 
GROUP BY column1 

In diesem Fall wird ein Ergebnis führen,

column1 column2     sumOfValue 
1  ABC,строка 3,строка 5 6  
2  BCD      3