2014-08-28 3 views
1

У меня есть запрос, который нуждается в счетчике COLA groupbed от colB двухкомпонентной частности среднего COlC значения. напримерПреобразование Sub запроса в одном запрос улого

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.

Смежные вопросы