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_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 |
+----+---------------------+
查询的行为是明确定义的,它会根据您的示例输入和输出给出所需的结果。
【讨论】:
【参考方案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) - 年月日期格式