2017-10-19 9 views
0

私はIDと名前(LASTにBigQueryの標準SQLに相当)

レガシーSQLで
id | name 
---------- 
1 | apple 
1 | banana 
2 | carrot 
3 | lemon 
3 | orange 

を持つテーブルを持って、一つは

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

のような文と結果を書くことができだろうこれが最後の関数を利用しています

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

ことhttps://cloud.google.com/bigquery/docs/reference/legacy-sql#last

BigQueryで標準SQLを使用している場合も同様の機能はありますか?

答えて

4

レガシーSQLのLASTについては、指定した例では出力が未定義です。入力テーブルスキャンが特定の順序を持​​つことが保証されていないため、この場合「最終」がどのように決定されるかは指定されません。書かれたとして、あなたは例えば、BigQueryの中に標準SQLからANY_VALUEでこれと同じクエリを表現することができ:

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    | 
+----+---------------------+ 

を私はしかし、それはあなたが後にしているものだとは思いません。目標は、このようなname値のソート順序として、いくつかの基準に基づいて、「最後」の値を取得する場合、あなたは例えば、ORDER BYLIMIT 1ARRAY_AGGを使用することができます。

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    | 
+----+---------------------+ 

クエリの振る舞いを明確に定義されており、サンプルの入力と出力に基づいて望ましい結果が得られます。

関連する問題