2014-08-28 2 views
1

에 서브 쿼리를 변환 나는 COLC 값의 특정 평균의 witha COLB에 의해 groupbed 콜라의 수를 필요로하는 쿼리가 있습니다. 예단일 쿼리 하이브

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 값에 대해 하나의 행을 가진 요약이면 충분할 것입니다.