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

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和名字的桌子

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)