2014-08-28 43 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價值一行的摘要就足夠了。