2017-10-19 1 views
0

Ich habe eine Tabelle mit der ID und NamenBigQuery Standard-SQL-äquivalent Last() von Legacy-Sql

id | name 
---------- 
1 | apple 
1 | banana 
2 | carrot 
3 | lemon 
3 | orange 

In Legacy-SQL-, könnte man eine Aussage wie

SELECT 
    id, 
    LAST(name) AS last_record_of_name, 
FROM 
    [project:table] 
GROUP BY 1 

schreiben und das Ergebnis würde

id | last_record_of_name 
---------- 
1 | banana 
2 | carrot 
3 | orange 
sein

Dies nutzt die Funktion LAST https://cloud.google.com/bigquery/docs/reference/legacy-sql#last

Gibt es eine ähnliche Funktion, wenn Standard-SQL in BigQuery verwendet wird?

Antwort

4

Die Sache über LAST von altem SQL ist, dass die Ausgabe für das Beispiel, das Sie gaben, undefiniert ist; In diesem Fall wird nicht spezifiziert, wie "last" bestimmt wird, da nicht garantiert ist, dass der Eingangstabellen-Scan eine bestimmte Reihenfolge hat. Wie geschrieben, können Sie diese gleiche Abfrage mit ANY_VALUE von Standard-SQL in BigQuery ausdrücken, z.B .:

WITH SampleInput AS (
    SELECT 1 AS id, 'apple' AS name UNION ALL 
    SELECT 1, 'banana' UNION ALL 
    SELECT 2, 'carrot' UNION ALL 
    SELECT 3, 'lemon' UNION ALL 
    SELECT 3, 'orange' 
) 
SELECT 
    id, 
    ANY_VALUE(name) AS last_record_of_name 
FROM SampleInput 
GROUP BY id; 
+----+---------------------+ 
| id | last_record_of_name | 
+----+---------------------+ 
| 1 | apple    | 
| 2 | carrot    | 
| 3 | lemon    | 
+----+---------------------+ 

Ich glaube nicht, dass das, was Sie nach, obwohl; wenn das Ziel, die „letzte“ Wert auf einige Kriterien, wie zum Beispiel die Sortierreihenfolge der name Werte basieren zu bekommen, dann können Sie ARRAY_AGG mit ORDER BY verwenden und LIMIT 1, zB:

WITH SampleInput AS (
    SELECT 1 AS id, 'apple' AS name UNION ALL 
    SELECT 1, 'banana' UNION ALL 
    SELECT 2, 'carrot' UNION ALL 
    SELECT 3, 'lemon' UNION ALL 
    SELECT 3, 'orange' 
) 
SELECT 
    id, 
    ARRAY_AGG(name ORDER BY name DESC LIMIT 1)[OFFSET(0)] AS last_record_of_name 
FROM SampleInput 
GROUP BY id; 
+----+---------------------+ 
| id | last_record_of_name | 
+----+---------------------+ 
| 1 | banana    | 
| 2 | carrot    | 
| 3 | orange    | 
+----+---------------------+ 

Das Verhalten der Abfrage ist gut definiert und liefert die gewünschten Ergebnisse basierend auf Ihrer Eingabe und Ausgabe.