Calculating percentile rankings in MS SQL

前端 未结 8 1629
清酒与你
清酒与你 2020-12-14 02:22

What\'s the best way to calculate percentile rankings (e.g. the 90th percentile or the median score) in MSSQL 2005?

I\'d like to be able to select the 25th, median,

8条回答
  •  南方客
    南方客 (楼主)
    2020-12-14 02:51

    The 50th percentile is same as the median. When computing other percentile, say the 80th, sort the data for the 80 percent of data in ascending order and the other 20 percent in descending order, and take the avg of the two middle value.

    NB: The median query has been around for a long time, but cannot remember where exactly I got it from, I have only amended it to compute other percentiles.

    DECLARE @Temp TABLE(Id INT IDENTITY(1,1), DATA DECIMAL(10,5))
    
    INSERT INTO @Temp VALUES(0)
    INSERT INTO @Temp VALUES(2)
    INSERT INTO @Temp VALUES(8)
    INSERT INTO @Temp VALUES(4)
    INSERT INTO @Temp VALUES(3)
    INSERT INTO @Temp VALUES(6)
    INSERT INTO @Temp VALUES(6)
    INSERT INTO @Temp VALUES(6) 
    INSERT INTO @Temp VALUES(7)
    INSERT INTO @Temp VALUES(0)
    INSERT INTO @Temp VALUES(1)
    INSERT INTO @Temp VALUES(NULL)
    
    
    --50th percentile or median
    SELECT ((
            SELECT TOP 1 DATA
            FROM   (
                    SELECT  TOP 50 PERCENT DATA
                    FROM    @Temp
                    WHERE   DATA IS NOT NULL
                    ORDER BY DATA
                    ) AS A
            ORDER BY DATA DESC) + 
            (
            SELECT TOP 1 DATA
            FROM   (
                    SELECT  TOP 50 PERCENT DATA
                    FROM    @Temp
                    WHERE   DATA IS NOT NULL
                    ORDER BY DATA DESC
                    ) AS A
            ORDER BY DATA ASC)) / 2.0
    
    
    --90th percentile 
    SELECT ((
            SELECT TOP 1 DATA
            FROM   (
                    SELECT  TOP 90 PERCENT DATA
                    FROM    @Temp
                    WHERE   DATA IS NOT NULL
                    ORDER BY DATA
                    ) AS A
            ORDER BY DATA DESC) + 
            (
            SELECT TOP 1 DATA
            FROM   (
                    SELECT  TOP 10 PERCENT DATA
                    FROM    @Temp
                    WHERE   DATA IS NOT NULL
                    ORDER BY DATA DESC
                    ) AS A
            ORDER BY DATA ASC)) / 2.0
    
    
    --75th percentile
    SELECT ((
            SELECT TOP 1 DATA
            FROM   (
                    SELECT  TOP 75 PERCENT DATA
                    FROM    @Temp
                    WHERE   DATA IS NOT NULL
                    ORDER BY DATA
                    ) AS A
            ORDER BY DATA DESC) + 
            (
            SELECT TOP 1 DATA
            FROM   (
                    SELECT  TOP 25 PERCENT DATA
                    FROM    @Temp
                    WHERE   DATA IS NOT NULL
                    ORDER BY DATA DESC
                    ) AS A
            ORDER BY DATA ASC)) / 2.0
    

提交回复
热议问题