第一个问题StackOverflow,刚刚开始使用SQL和BigQuery。
在BigQuery上,我有一个包含一个表的项目:table
。
该表包含:
-一些数据x
,
-每个条目time
的一些时间戳记,
-一些对条目进行分区的组标识符group
,
-和一个名为INTEGER
的{{1}}列,其中包含所有rank
值。
我想使用NULL
更改以下UPDATE
值:
NULL
应该以{{1}}的升序(rank
记录在组中最早的group
}的基础上代表time
的基础上rank=1
中每一行的排名,x
代表以下等)
这是我设置查询的方式:
rank=2
查询没有错误地执行,BigQuery告诉我所有行都按预期进行了修改。但是当我检查时,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
的值仍然是rank
。
由于我已经检查到NULL
是否按预期生成,因此我猜测rankvalue
语句中存在一些问题。
不过,我检查了JOIN
确实确实从rank1
继承了我创建的所有temp
。所以我不明白为什么id
失败。
替代:
我尝试了另一种方法: first 为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
。我不明白为什么,因为我验证了WITH / SELECT / FROM子查询返回的行数与Scalar subquery produced more than one element
中的行数完全相同。
非常感谢任何人。
更新:
我尝试了以下方法,并且有效:
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
并将其与相应的{{1} }(也就是说,它在LHS中为LHS中的每一行选择一行),而table.rank
将为rank.id
的每个值返回整个联接表正在进行更新(即,LHS中的每一行在RHS上有多行)?