Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery BigQuery中的行数?_Google Bigquery - Fatal编程技术网

Google bigquery BigQuery中的行数?

Google bigquery BigQuery中的行数?,google-bigquery,Google Bigquery,有没有办法获取BigQuery中每条记录的行号?从规格来看,我没有看到任何关于它的东西,有一个第n个函数,但它适用于重复字段 在某些情况下,BigQuery中不需要行数,例如使用TOP或LIMIT函数。但是,我需要它来模拟一些分析函数,例如累积和。为此,我需要用序列号标识每个记录。有解决办法吗 提前感谢您的帮助 Leo我们不公开行标识符。导入数据时,您能简单地向数据中添加一个吗?我想也许我可以通过在2018更新时将一个表连接到表本身来解决缺少行号函数的问题:如果您只需要为每行添加一个唯一的id

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

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

提前感谢您的帮助


Leo

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

我想也许我可以通过在2018更新时将一个表连接到表本身来解决缺少行号函数的问题:如果您只需要为每行添加一个唯一的id

2018标准SQL解决方案:

但是查询执行期间超出的资源又如何呢:查询无法在分配的内存中执行。OVER运算符使用了太多内存

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

SELECT *, ROW_NUMBER() OVER() 
FROM `publicdata.samples.natality` 
是-发生这种情况是因为OVER需要将所有数据放入一个VM中-您可以使用分区解决此问题:

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现在有一个行数函数

简单的例子:

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)
另一种破解方法是:

SELECT *
FROM UNNEST(ARRAY(
    SELECT myColumn FROM myTable
)) AS myValue WITH OFFSET off
这将为您提供一个带有2列的结果集:myValue和off

这样做的好处是,您还可以在WHERE子句中使用off来创建非确定性限制,例如WHERE off<从mySecondTable选择SUMamount


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

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

我使用一个带有偏移量的引导表,将每个分区添加到其所有行中。此偏移量是它前面所有分区中的行总数

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

谢谢你的回答,瑞安。即使我们可以在导入中导入行标识符,它也不会有用,因为我们在对原始数据应用组函数后需要行号。因此,您要查找的是结果行,而不是表示基础数据的每一行的行?我们如何筛选该行号列?i、 e.行号>10等子查询。如果需要,请发布新问题以获得完整答案!
SELECT *
FROM UNNEST(ARRAY(
    SELECT myColumn FROM myTable
)) AS myValue WITH OFFSET off
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