Bigquery标准Sql相当于遗留Sql中的LAST()
我有一张有id和名字的桌子Bigquery标准Sql相当于遗留Sql中的LAST(),sql,google-bigquery,Sql,Google Bigquery,我有一张有id和名字的桌子 id | name ---------- 1 | apple 1 | banana 2 | carrot 3 | lemon 3 | orange 在遗留Sql中,可以编写如下语句 SELECT id, LAST(name) AS last_record_of_name, FROM [project:table] GROUP BY 1 结果是 id | last_record_of_name ---------
id | name
----------
1 | apple
1 | banana
2 | carrot
3 | lemon
3 | orange
在遗留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
这利用了最后一个功能
如果在BigQuery中使用标准sql,是否有类似的函数 关于遗留SQL的
LAST
,您给出的示例的输出是未定义的;在这种情况下,它没有指定如何确定“last”,因为不能保证输入表扫描具有任何特定顺序。如前所述,您可以使用BigQuery中标准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 |
+----+---------------------+
但我不认为这就是你想要的;如果目标是基于某些标准(例如名称
值的排序顺序)获取“最后”值,则可以使用数组_AGG
与排序依据
和限制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 |
+----+---------------------+
查询的行为定义良好,它根据您的示例输入和输出给出所需的结果。使用Python BigQuery的Array_Agg()工作解决方案: !pip安装-U谷歌云bigquery 作为pd进口熊猫 从google.cloud导入bigquery strvalue=“”选择用户 数组_AGG(结构(会话,页面))作为hasComp 从
哪里
按用户分组按用户排序
限制100“
bigquery\u client=bigquery.client(project=”“)
dataset=bigquery\u client.dataset(“”)
表=数据集。表(“”)
table.view\u query\u legacy\u sql=False
query\u job=bigquery\u client.query(str\u值)
df=查询作业到数据帧()
打印(df)