我的查询需要按 colB 分组 colA ,具有 COlC 值的特定平均值。例如
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
示例结果可能是
No of User, URL , average time spent
90182 , abc.com, 334
293556 , def.com, 33
上述查询的问题在于,由于它有子查询,因此内部子查询将大量数据作为中间结果混合到外部查询,这导致查询在大型数据集上变得非常慢。
有没有办法可以将上面的查询转换为没有任何子查询的查询,或者是否有任何可用的UDAF,这样就不会有更多的中间数据重载并且只在一个阶段运行?
答案 0 :(得分:1)
我没有看到简化查询的简便方法。但是,将having
子句移动到子查询中可能会对性能有所帮助:
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;
您想要按一组行的平均值进行聚合。这似乎需要两个操作 - 一个用于计算平均值,另一个用于最终聚合。
实际上,如果我考虑一下,以下可能会做你想要的:
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
值有一行的摘要就足够了。