BigQuery中的行号?

时间:2012-06-15 19:45:29

标签: google-bigquery

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

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

提前感谢您的帮助!

利奥

5 个答案:

答案 0 :(得分:27)

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)

  

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

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

SELECT *, ROW_NUMBER() OVER() 
FROM `publicdata.samples.natality` 

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

SELECT *, ROW_NUMBER() OVER(PARTITION BY year, month) rn 
FROM `publicdata.samples.natality` 

  

“但现在很多行都有相同的行号,而我想要的每行都有不同的ID”

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

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

enter image description here


最初的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)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我想也许我可以解决缺少ROW_NUMBER()函数的问题,方法是将一个表连接到一个< =然后对结果进行计数(*)(这有时你在MySQL中这样做) )。事实证明,BigQuery仅支持直接加入“=”。

再次挫败。我认为这在BQ是不可能的。

答案 3 :(得分:0)

另一个 HACK 将遵循以下原则:

SELECT *
FROM UNNEST(ARRAY(
    SELECT myColumn FROM myTable
)) AS myValue WITH OFFSET off

这将为您提供一个包含2个列的结果集:myValueoff

这样做的好处是,您还可以在off子句中使用WHERE来创建不确定的LIMIT,例如WHERE off < (SELECT SUM(amount) FROM mySecondTable)

请注意,对于大量数据,我认为这不是可行的选择。但这可能适合您的用例。

答案 4 :(得分:0)

我最近遇到了这个问题,但是我的用例需要从头到尾连续的行号。可能不是很理想,但将其留在这里以防它可以帮助某人。

我对每个要添加到其所有行的分区使用偏移表。此偏移量是其所有先前分区中的行的总计数。

select offset+ROW_NUMBER() OVER(PARTITION BY partitionDate) rowId
from `sample.example` input
left join
      (select partitions.partitionDate, partitions.count, SUM(duplicate.count)-partitions.count as offset
       from (
           select date(_PARTITIONTIME) partitionDate,COUNT(1) count 
           FROM `sample.example` 
           where date(_PARTITIONTIME) >= "2020-01-01" 
           group by _PARTITIONTIME) partitions
      inner join (
           select date(_PARTITIONTIME) partitionDate,COUNT(1) count 
           FROM `sample.example`
           where date(_PARTITIONTIME) >= "2020-01-01" 
           group by _PARTITIONTIME) duplicate 
      on partitions.partitionDate >= duplicate.partitionDate
      group by partitions.partitionDate, partitions.count
      order by partitions.partitionDate) guide
on date(_PARTITIONTIME) = guide.partitionDate
where date(_PARTITIONTIME) >= "2020-01-01" 
order by partitionDate