Bigquery Standard Sql相当于Legacy Sql中的LAST()

jam*_*234 0 sql google-bigquery

我有一个带有id和名字的表

id  | name
----------
1   |  apple
1   |  banana
2   |  carrot
3   |  lemon
3   |  orange
Run Code Online (Sandbox Code Playgroud)

在Legacy Sql中,可以写一个类似的语句

SELECT
    id,
    LAST(name) AS last_record_of_name,
FROM
  [project:table]
GROUP BY 1
Run Code Online (Sandbox Code Playgroud)

结果就是

id  | last_record_of_name
----------
1   |  banana
2   |  carrot
3   |  orange
Run Code Online (Sandbox Code Playgroud)

这利用了最新功能https://cloud.google.com/bigquery/docs/reference/legacy-sql#last

如果在BigQuery中使用标准sql,是否有类似的功能?

Ell*_*ard 6

关于事情LAST从遗留的SQL是输出是不确定的,你给的例子; 它没有指定在这种情况下如何确定"最后",因为输入表扫描不能保证具有任何特定顺序.如上所述,您可以使用ANY_VALUEBigQuery中的标准SQL 表达相同的查询,例如:

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               |
+----+---------------------+
Run Code Online (Sandbox Code Playgroud)

不过,我不认为这就是你所追求的; 如果目标是让基于一些标准,如排序顺序的"最后一个"值name的值,那么你可以使用ARRAY_AGGORDER BYLIMIT 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              |
+----+---------------------+
Run Code Online (Sandbox Code Playgroud)

查询的行为是明确定义的,它根据您的示例输入和输出提供所需的结果.