Para calcular la desviación estándar, debe iterar a través de todos los elementos, por lo que sería imposible hacerlo en una sola consulta. La forma perezosa sería hacerlo en dos pasadas:
DECLARE
@Avg int,
@StDev int
SELECT @Avg = AVG(Sales), @StDev = STDEV(Sales)
FROM tbl_sales
WHERE ...
SELECT AVG(Sales) AS AvgSales, MAX(Sales) AS MaxSales, MIN(Sales) AS MinSales
FROM tbl_sales
WHERE ...
AND Sales >= @Avg - @StDev * 3
AND Sales <= @Avg + @StDev * 3
Otra opción simple que podría trabajo (bastante común en el análisis de datos científicos) sería dejar caer el mínimo y el máximo x valores, que funciona si tiene muchos datos para procesar. Puedes usar ROW_NUMBER
para hacer esto en una declaración:
WITH OrderedValues AS
(
SELECT
Sales,
ROW_NUMBER() OVER (ORDER BY Sales) AS RowNumAsc,
ROW_NUMBER() OVER (ORDER BY Sales DESC) AS RowNumDesc
)
SELECT ...
FROM tbl_sales
WHERE ...
AND Sales >
(
SELECT MAX(Sales)
FROM OrderedValues
WHERE RowNumAsc <= @ElementsToDiscard
)
AND Sales <
(
SELECT MIN(Sales)
FROM OrderedValues
WHERE RowNumDesc <= @ElementsToDiscard
)
Reemplazar ROW_NUMBER
con RANK
o DENSE_RANK
si desea descartar un cierto número de únicos valores.
Más allá de estos simples trucos, comienzas a entrar en algunas estadísticas bastante pesadas. Tengo que lidiar con tipos similares de validación y es demasiado material para una publicación SO. Hay cien algoritmos diferentes que puedes modificar de una docena de maneras diferentes. ¡Intentaría mantenerlo simple si es posible!