sql >> Base de Datos >  >> RDS >> Sqlserver

SQL:muestra el promedio y el mínimo/máximo dentro de las desviaciones estándar

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!