【问题标题】:Bigquery query limits upper and lower boundsBigquery 查询限制上限和下限
【发布时间】:2023-03-03 01:24:01
【问题描述】:

在 mysql 上我会输入以下查询,但在 google BigQuery 上运行相同的查询会引发上限错误。如何指定查询的限制?假设我有一个返回 20 个结果的查询,而我只想要 5 到 10 个之间的结果,我应该如何在 Google BigQuery 上构建查询?)

例如:

SELECT id,
       COUNT(total) AS total 
FROM ABC.data 
GROUP BY id 
ORDER BY count DESC 
      LIMIT 5,10;

如果我只在查询末尾加上“LIMIT 5”,我会得到前 5 名,如果我输入“LIMIT 10”,我会得到前 10 名,但是我使用什么语法来得到 5 到 10 之间.

有人能解释一下吗?

非常感谢任何帮助。

谢谢,祝你有美好的一天。

【问题讨论】:

  • 你使用什么 RDBMW?
  • 在 Rails 中我使用 mysql,所以我会使用上面的,但是在 bigquery ui 上运行相同的 for 会导致错误。
  • 您不能使用 rank 函数添加排名变量并使用 where 子句过滤结果吗?我从未使用过 MySql,但这就是我在 Postgres 中的做法,这里是 MySQL 中排名函数的链接:stackoverflow.com/questions/3333665/mysql-rank-function

标签: python sql ruby google-bigquery


【解决方案1】:

窗口函数答案是一个很好的答案,但我想我会提供另一个选项,涉及如何获取结果而不是如何运行查询。

如果您只需要前 N 行,您可以在查询中添加 LIMIT N。但如果您不需要前 M 行,则可以更改获取结果的方式。如果您使用的是 java API,则可以在 TableData.list()Jobs.getQueryResults() 调用上使用 setStartIndex() 方法,仅从特定索引开始获取行。

【讨论】:

    【解决方案2】:

    我会使用窗口函数... 像

    select * from 
    (Select id, total, row_number() over (order by total desc) as rnb
    from
    (SELECT id,
           COUNT(total) AS total 
    FROM ABC.data 
    GROUP BY id 
    ))
    where rnb>=5 and rnb<=10
    

    【讨论】:

      【解决方案3】:

      这个问题对于不断变化的数据集毫无意义。如果您在请求前 5 个和下一个 5 之间有 1 秒的延迟......数据可能已经改变。它的顺序现在不同了,您将丢失数据或得到重复的结果。因此,像 BigTable 这样的数据库有一种方法可以对数据进行一次查询并将结果集分组提供给您。如果是这种情况:您要查找的内容称为查询游标。我不能说这比他们自己的例子更好,所以[这里是他们的文档。][1]

      但既然你说数据不会改变,那么 fetch() 就可以正常工作。 fetch() 有 2 个选项,您需要注意限制和偏移量。 'limit' 是要返回的最大结果数。如果设置为 None,将检索所有可用的结果。 'offset' 是要跳过多少个结果。 在此处查看其他选项:https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_fetch

      【讨论】:

      • 我没有关注你。就我而言,数据一旦在谷歌 bigquery 中就不会改变。一旦进入,我想运行几个查询,其中一些有限制。例如,我有一些返回 20 行的东西,我只想要第 5-10 行或类似的行。这在 Bigquery 上是如何实现的?可以在 Bigquery 上实现吗?
      • 我认为我们在这里谈论的是两个不同的东西——我指的是 Google Bigquery,而您指的是 Appengine/Datastore。 Bigquery 文档仅用于限制仅指定一个数字,而不是我想要获得的范围。感谢您查看问题,都一样。
      • Appengine 在 Google BigTable(google 的 NoSql DB)上运行。我认为 bigquery 是 BigTable 上可用的 GQL 的另一个名称。很抱歉混淆了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多