首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动调整bucket大小,10个bucket覆盖全范围

自动调整bucket大小,10个bucket覆盖全范围
EN

Stack Overflow用户
提问于 2019-05-07 04:29:55
回答 1查看 32关注 0票数 0

下面的查询可以完美地工作:

代码语言:javascript
复制
select
  floor(duration / 100) * 100 as bucket,
  count(*) as count
from flights
group by floor(duration / 100) * 100
order by bucket asc

但是,我尝试使存储桶大小自动调整为值的范围,以便在整个范围内总共有10个存储桶:

代码语言:javascript
复制
select
  floor(duration / (max(duration)/10)) * (max(duration)/10) as bucket,
  count(*) as count
from flights
group by floor(duration / (max(duration)/10)) * (max(duration)/10)
order by bucket asc

-- SYNTAX_ERROR: GROUP BY clause cannot contain aggregations or window functions: ["max"("duration"), "max"("duration")]

这个失败的查询中的想法是使用最大值(假设最小值为0)来派生存储桶大小。有没有办法让它工作,或者完全使用更好的方法?

EN

回答 1

Stack Overflow用户

发布于 2019-05-07 05:27:38

您需要使用单独的子查询显式计算max(duration)。用(SELECT max(duration) FROM flights)替换max(duration)

作为一个副作用,flights表将被读取两次。它应该只读两次,而不是更多。可以通过运行EXPLAIN <your query>并在输出中搜索Scan来验证这一点。如果flights使用扫描仪的次数超过两次,则可以进一步改进。实际上,改进后的版本可能更易于阅读(我还通过引用first select item使用了速记GROUP BYORDER BY子句):

代码语言:javascript
复制
SELECT
  floor(duration / (max_duration/10)) * (max_duration/10) as bucket,
  count(*) as count
FROM flights, (SELECT max(duration) max_duration FROM flights)
GROUP BY 1
ORDER BY 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56012016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档