Bigquery Standard Sql 等效于 Legacy Sql 中的 LAST()

Posted

技术标签:

【中文标题】Bigquery Standard Sql 等效于 Legacy Sql 中的 LAST()【英文标题】:Bigquery Standard Sql equivalent to LAST() from Legacy Sql 【发布时间】:2017-10-19 22:36:03 【问题描述】:

我有一个带有 id 和 name 的表

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

在 Legacy Sql 中,可以编写如下语句

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

这利用了函数 LAST https://cloud.google.com/bigquery/docs/reference/legacy-sql#last

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

【问题讨论】:

【参考方案1】:

关于旧版 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_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              |
+----+---------------------+

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

【讨论】:

【参考方案2】:

Array_Agg() 与 Python BigQuery 的工作解决方案:

!pip install -U google-cloud-bigquery

将熊猫导入为 pd

从 google.cloud 导入 bigquery

strvalue = """选择用户 ARRAY_AGG(STRUCT(session, page)) 作为 hasComp 来自<datasetname>.<tableName> 哪里 按用户分组 按用户排序 限制 100 """

bigquery_client = bigquery.Client(project="")

数据集 = bigquery_client.dataset("")

table = dataset.table('')

table.view_query_legacy_sql = False

query_job = bigquery_client.query(str_value)

df = query_job.to_dataframe()

打印(df)

【讨论】:

以上是关于Bigquery Standard Sql 等效于 Legacy Sql 中的 LAST()的主要内容,如果未能解决你的问题,请参考以下文章

什么 DataGrip SQL Dialect 最接近 BigQuery STANDARD SQL (SQL 2011)

使用外部 UDF 库运行 BigQuery Standard SQL

有没有办法在BigQuery Standard SQL中解析XML标签?

Bigquery (Standard Sql) - 年月日期格式

PARSE_DATE : 解析函数 BigQuery/Standard SQL 的结果无效

有没有办法在 BigQuery Standard SQL 中解析 XML 标签?