Bigquery标准Sql相当于Legacy Sql中的LAST()

时间:2017-10-19 22:36:04

标签: sql google-bigquery

我有一个id和名称

的表
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,是否有类似的功能?

2 个答案:

答案 0 :(得分:6)

来自旧版SQL的import keras.utils.multi_gpu_model --------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) <ipython-input-7-0174878249b1> in <module>() ----> 1 import keras.utils.multi_gpu_model 2 ModuleNotFoundError: No module named 'keras.utils.multi_gpu_model' 的问题是,您提供的示例的输出未定义;它没有指定在这种情况下如何确定“最后”,因为输入表扫描不能保证具有任何特定顺序。如上所述,您可以使用来自BigQuery中标准SQL的LAST来表达相同的查询,例如:

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 | +----+---------------------+ 值的排序顺序,那么您可以将nameARRAY_AGG和{{1}一起使用},例如:

ORDER BY

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

答案 1 :(得分:0)

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

!pip install -U google-cloud-bigquery

将熊猫作为pd导入

从google.cloud导入bigquery

strvalue =“”“ SELECT个用户 ARRAY_AGG(STRUCT(session,page))as 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()

print(df)