2014-08-28 65 views
1

我有需要通过COLB groupbed戕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可用,所以没有更多的中间数据的主要洗牌,它在单一阶段运行?

回答

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价值一行的摘要就足够了。