有没有办法获取 BigQuery 中每条记录的行号? (从规范来看,我没有看到任何关于它的信息)有一个 NTH() 函数,但这适用于重复的字段。
BigQuery 中有一些场景不需要行号,例如使用 TOP() 或 LIMIT 函数。但是,我需要它来模拟一些分析函数,例如累积 sum()。为此,我需要用序列号标识每条记录。有什么解决方法吗?
在此先感谢您的帮助!
狮子座
最佳答案
2018 年更新:如果您只想要每行的唯一 ID
#standardSQL
SELECT GENERATE_UUID() uuid
, *
FROM table
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)
But what about "Resources exceeded during query execution: The query could not be executed in the allotted memory. OVER() operator used too much memory.."
好的,让我们重现该错误:
SELECT *, ROW_NUMBER() OVER()
FROM `publicdata.samples.natality`
是的 - 发生这种情况是因为 OVER() 需要将所有数据放入一个 VM - 您可以使用 PARTITION 解决这个问题:
SELECT *, ROW_NUMBER() OVER(PARTITION BY year, month) rn
FROM `publicdata.samples.natality`
"But now many rows have the same row number and all I wanted was a different id for each row"
好的好的。让我们使用分区来为每一行提供一个行号,并将该行号与分区字段结合起来以获得每行的唯一 id:
SELECT *
, FORMAT('%i-%i-%i', year, month, ROW_NUMBER() OVER(PARTITION BY year, month)) id
FROM `publicdata.samples.natality`
2013 年的原始解决方案:
好消息:BigQuery 现在有一个 row_number 函数。
简单的例子:
SELECT [field], ROW_NUMBER() OVER()
FROM [table]
GROUP BY [field]
更复杂的工作示例:
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)
关于google-bigquery - BigQuery 中的行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11057219/