首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将子查询转换为单个查询单元

将子查询转换为单个查询单元
EN

Stack Overflow用户
提问于 2014-08-28 10:01:08
回答 1查看 425关注 0票数 1

我有一个查询,它需要一个colA计数,它由colB组成,平均值为COlC。例如

代码语言:javascript
复制
SELECT COUNT( X.colA ), X.colB , X.MEASURE
FROM (
  SELECT colA  , colB  , avg(colC) MEASURE
  FROM tableA
  GROUP BY colA, colB
  HAVING round(avg(colC),2) > 0
) X 
GROUP BY X.MEASURE , X.colB
HAVING X.MEASURE BETWEEN 0 AND 3000
ORDER BY MEASURE

示例结果可以是

代码语言:javascript
复制
No of User, URL    , average time spent
90182     , abc.com,    334
293556    , def.com,     33

上述查询的问题在于,由于它有子查询,内部子查询将大量的数据作为中间结果处理到外部查询,导致大数据集的查询速度变慢。

是否有一种方法可以将上面的查询转换为没有任何子-query的查询,或者是否有任何可以使用的联非新议程,这样就不会有更多的中间数据的大洗牌,并且它只在一个阶段运行?

EN

回答 1

Stack Overflow用户

发布于 2014-08-28 10:47:09

我不认为有一种简单的方法可以简化查询。但是,将having子句移到子查询中可能会对性能有所帮助:

代码语言:javascript
复制
SELECT COUNT( X.colA ), X.colB , X.MEASURE
FROM (SELECT colA  , colB  , avg(colC) MEASURE
      FROM tableA
      GROUP BY colA, colB
      HAVING round(avg(colC),2) > 0 and avg(colC) <= 3000
     ) X 
GROUP BY X.MEASURE , X.colB
ORDER BY MEASURE;

您希望通过一组行的平均值进行聚合。这似乎需要两个操作-一个用于计算平均值,另一个用于最终聚合。

实际上,如果我想一想,以下几点可能会做你想做的事:

代码语言:javascript
复制
select colB, count(distinct colA), sum(colC) / count(distinct colA) as measure
from tableA
group by colA
having sum(colC) / count(distinct colA) between 0 and 3000
order by measure;

这并不完全相同,但我不明白在外部查询中按measure分组的目的。也许为每个b值带一行的摘要就足够了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25546011

复制
相关文章

相似问题

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