0

第一个问题 StackOverflow,刚刚开始使用 SQL 和 BigQuery。

在 BigQuery 上,我有一个带有一张表的项目:table.
该表包含:
-一些数据x, -一些每个条目的
时间戳,-一些对条目进行分区的 组标识符, -以及一个使用所有值 调用的列。time
group
INTEGERrankNULL

我想用来UPDATE更改这些NULL值:应该表示基于,以升序排列
rank的每一行内的排名(对于组中最早记录的,对于以下一行等)grouptimerank=1xrank=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它确实继承tempid我创建的所有内容。所以我不明白为什么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.rankrank.idproject.table INNER JOIN rank1 ON table.id=rank1.idtable.rank

4

0 回答 0