sql >> Databasteknik >  >> RDS >> Sqlserver

SQL:Visa medelvärde och min/max inom standardavvikelser

För att beräkna standardavvikelsen måste du iterera igenom alla element, så det skulle vara omöjligt att göra detta i en fråga. Det lata sättet skulle vara att bara göra det i två omgångar:

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

Ett annat enkelt alternativ som kan arbete (ganska vanligt vid analys av vetenskapliga data) skulle vara att bara släppa minsta och högsta x värden, vilket fungerar om du har mycket data att bearbeta. Du kan använda ROW_NUMBER för att göra detta i ett uttalande:

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
)

Ersätt ROW_NUMBER med RANK eller DENSE_RANK om du vill kassera ett visst antal unika värden.

Utöver dessa enkla knep börjar du komma in i ganska tung statistik. Jag måste hantera liknande typer av validering och det är alldeles för mycket material för ett SO-inlägg. Det finns hundra olika algoritmer som du kan justera på ett dussin olika sätt. Jag skulle försöka hålla det enkelt om möjligt!



  1. Oracle datum korruption under uppdatering

  2. JPA SequenceGenerator och GeneratedValue:namn / generatoregenskap unik endast per klass?

  3. Uppdatering av en mysql-datatabell från frågeparametrar med hjälp av nodejs och express

  4. Konvertera Varchar2 till Char array i Oracle