关于旧版 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 值的排序顺序)获取“最后一个”值,则可以将 ARRAY_AGG 与 ORDER BY 和 LIMIT 1 一起使用,例如:
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 |
+----+---------------------+
查询的行为是明确定义的,它会根据您的示例输入和输出给出所需的结果。