【问题标题】:Row number in BigQuery?BigQuery 中的行号?
【发布时间】:2012-06-18 21:50:25
【问题描述】:

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

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

提前感谢您的帮助!

狮子座

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

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

    我使用了一个指导表,其中每个分区的偏移量被添加到它的所有行中。这个偏移量是它之前所有分区中行的总和。

    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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      请注意,我不认为这是处理大量数据的可行替代方案。但它可能适合您的用例。

      【讨论】:

        【解决方案3】:

        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` 
        


        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)
        

        【讨论】:

        • 我们如何过滤 ROW_NUMBER 列? (即 ROW_NUMBER() > 10 等)
        • 子查询。如果需要,请发布新问题以获得完整答案!
        【解决方案4】:

        我想也许我可以通过在

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 感谢您的回答瑞恩。即使我们可以在我们的导入中导入行标识符,它也不会有用,因为在对原始数据应用分组函数之后我们需要行号。
          • 所以您要查找结果行#,而不是表示基础数据每一行的行#?
          猜你喜欢
          • 2017-09-06
          • 2018-11-28
          • 1970-01-01
          • 2022-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多