レガシー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 BY
とLIMIT 1
でARRAY_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 |
+----+---------------------+
クエリの振る舞いを明確に定義されており、サンプルの入力と出力に基づいて望ましい結果が得られます。