2013-05-18 1 views
0

Я использую этот запрос, чтобы вернуть распределение поля поплавка вокруг его средний:Как выполнить арифметические операции над полями данных и агрегатными функциями в where where?

SELECT COUNT(*) AS [Count], Result FROM (
    SELECT ROUND(Result - AVG(Result) OVER(), 1) Result FROM Results) 
GROUP BY Result 

Этого запрос возвращает расстояние между всеми записями и медианой. Теперь мне нужно отфильтровать записи, которые находятся вне диапазона ± 3SD. Я думал, что, возможно, я мог бы легко достичь, изменив мой запрос к этому:

SELECT COUNT(*) AS [Count], Result FROM (
    SELECT ROUND(Result - AVG(Result) OVER(), 1) Result FROM Results 
    HAVING Abs(Result - AVG(Result)) OVER() < 3 * STDEV(Result) OVER()) 
GROUP BY Result 

Но SQL Server дает мне две ошибок:

Колонок «Results.Result» недопустим в HAVING предложения, потому что это не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Оконные функции могут отображаться только в предложениях SELECT или ORDER BY.

Как я могу достичь того, что я ищу? Google не очень добр ко мне сегодня :-(

ответ

3

Как указано второе сообщение об ошибке, оконные функции могут появляться только в предложениях SELECT или ORDER BY, поэтому вместо их включения в предложение HAVING включить их во внутреннюю SELECT, а затем выберите их во внешнем предложении WHERE - например:

SELECT COUNT(*) AS [Count], Result FROM  
(SELECT ROUND(Result - AVG(Result) OVER(), 1) Result, 
     Abs(Result - AVG(Result) OVER()) avgdiff, 
     STDEV(Result) OVER() stddev 
FROM Results) r 
WHERE avgdiff < 3 * stddev 
GROUP BY Result 
Смежные вопросы