sql >> Database teknologi >  >> RDS >> Sqlserver

SQL:Vis gennemsnit og min/max inden for standardafvigelser

For at beregne standardafvigelsen skal du iterere gennem alle elementerne, så det ville være umuligt at gøre dette i én forespørgsel. Den dovne måde ville være bare at gøre det i to omgange:

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

Endnu en simpel mulighed, som måske arbejde (temmelig almindeligt i analyse af videnskabelige data) ville være at droppe minimum og maksimum x værdier, som virker, hvis du har mange data at behandle. Du kan bruge ROW_NUMBER at gøre dette i én erklæring:

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
)

Erstat ROW_NUMBER med RANK eller DENSE_RANK hvis du vil kassere et vist antal unikke værdier.

Ud over disse simple tricks begynder du at komme ind i nogle ret tunge statistikker. Jeg skal forholde mig til lignende former for validering, og det er alt for meget materiale til et SO-indlæg. Der er hundrede forskellige algoritmer, som du kan justere på et dusin forskellige måder. Jeg vil prøve at holde det simpelt, hvis det er muligt!



  1. Sådan fungerer LEFT()-funktionen i MySQL

  2. Indekseringskolonne med REPLACE-funktion i mySQL

  3. mysql - Dynamisk kolonnealias

  4. Har brug for hjælp til at gemme værdi fra tre kolonner