第一个问题 StackOverflow,刚刚开始使用 SQL 和 BigQuery。
在 BigQuery 上,我有一个带有一张表的项目:table
.
该表包含:
-一些数据x
, -一些每个条目的
时间戳,-一些对条目进行分区的
组标识符,
-以及一个使用所有值 调用的列。time
group
INTEGER
rank
NULL
我想用来UPDATE
更改这些NULL
值:应该表示基于,以升序排列
rank
的每一行内的排名(对于组中最早记录的,对于以下一行等)group
time
rank=1
x
rank=2
这是我设置查询的方式:
UPDATE project.table
SET table.rank = (
WITH temp AS (select *, GENERATE_UUID() AS id FROM project.table),
rank1 AS (
SELECT * , RANK() OVER(PARTITION BY group ORDER BY time ASC)
AS rankvalue FROM temp
)
SELECT rank1.rankvalue
FROM temp INNER JOIN rank1 ON temp.id=rank1.id
)
WHERE table.rank IS NULL
查询执行没有错误,BigQuery 告诉我所有行都已按预期进行了修改。但是当我检查时, 的值rank
仍然是NULL
。
由于我检查了它rankvalue
是否按预期生成,我的猜测是JOIN
语句中存在一些问题。
不过,我已经检查过rank1
它确实继承temp
了id
我创建的所有内容。所以我不明白为什么JOIN
失败。
替代方案:
我尝试了另一种方法来执行此操作:我尝试首先将唯一的行标识符分配给table
,称为id
,然后使用以下查询:
UPDATE project.table
SET table.rank = (
WITH rank1 AS (
SELECT * , RANK() OVER(PARTITION BY group ORDER BY time ASC)
AS rankvalue FROM project.table
)
SELECT rank1.rankvalue
FROM project.table INNER JOIN rank1 ON table.id=rank1.id
)
WHERE table.rank IS NULL
但是这个查询返回一个错误:Scalar subquery produced more than one element
。我不明白为什么,因为我验证了 WITH/SELECT/FROM 子查询返回的行数与table
.
非常感谢任何抬头。
更新:
我尝试了以下方法并且有效:
UPDATE project.table
SET table.rank = (
WITH rank1 AS (
SELECT * , RANK()
OVER(
PARTITION BY group
ORDER BY time AS
) AS rankvalue
FROM project.table)
SELECT rank1.rankvalue
FROM rank1 WHERE
table.id=rank1.id
)
WHERE TRUE
这是我之前尝试过的第二种选择的修改。问题:它现在是否有效,因为WHERE table.id=rank1.id
选择与正在更新的每个人 table.id
相对应的每个人并将其与对应的人匹配(即,它为 LHS 中的每一行选择 RHS 中的一行),而将返回整个连接表对于正在更新的每个值(即,对于 LHS 中的每一行,RHS 上的多行)?table.rank
rank.id
project.table INNER JOIN rank1 ON table.id=rank1.id
table.rank