BigQuery中的行号?

Leo*_*efa 11 google-bigquery

有没有办法获取BigQuery中每条记录的行号?(从规格来看,我还没有看到任何关于它的东西)有一个NTH()函数,但这适用于重复的字段.

在某些情况下,BigQuery中不需要行号,例如使用TOP()或LIMIT函数.但是,我需要它来模拟一些分析函数,例如累积和().为此,我需要用序号识别每条记录.对此有任何解决方法吗?

在此先感谢您的帮助!

狮子座

Fel*_*ffa 33

2018更新:如果您想要的是每行的唯一ID

#standardSQL
SELECT GENERATE_UUID() uuid
 , * 
FROM table
Run Code Online (Sandbox Code Playgroud)

2018 #standardSQL解决方案:

SELECT
  ROW_NUMBER() OVER() row_number, contributor_username,
  count
FROM (
  SELECT contributor_username, COUNT(*) count
  FROM `publicdata.samples.wikipedia`
  GROUP BY contributor_username
  ORDER BY COUNT DESC
  LIMIT 5)
Run Code Online (Sandbox Code Playgroud)

但是"查询执行过程中资源超出了:查询无法在分配的内存中执行.OVER()运算符使用了太多的内存.."

好的,让我们重现那个错误:

SELECT *, ROW_NUMBER() OVER() 
FROM `publicdata.samples.natality` 
Run Code Online (Sandbox Code Playgroud)

是的 - 这是因为OVER()需要将所有数据都装入一个VM - 您可以使用PARTITION解决这个问题:

SELECT *, ROW_NUMBER() OVER(PARTITION BY year, month) rn 
FROM `publicdata.samples.natality` 
Run Code Online (Sandbox Code Playgroud)

"但是现在很多行都有相同的行号,我想要的每行都有不同的id"

好的好的.让我们使用分区为每一行提供行号,让我们将该行号与分区字段组合起来,以获得每行的唯一ID:

SELECT *
  , FORMAT('%i-%i-%i', year, month, ROW_NUMBER() OVER(PARTITION BY year, month)) id
FROM `publicdata.samples.natality` 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


最初的2013解决方案:

好消息:BigQuery现在有一个row_number函数.

简单的例子:

SELECT [field], ROW_NUMBER() OVER()
FROM [table]
GROUP BY [field]
Run Code Online (Sandbox Code Playgroud)

更复杂的工作示例:

SELECT
  ROW_NUMBER() OVER() row_number,
  contributor_username,
  count,
FROM (
  SELECT contributor_username, COUNT(*) count,
  FROM [publicdata:samples.wikipedia]
  GROUP BY contributor_username
  ORDER BY COUNT DESC
  LIMIT 5)
Run Code Online (Sandbox Code Playgroud)


Rya*_*oyd 0

我们不公开行标识符。您可以在导入数据时简单地在数据中添加一个吗?