sql - 如何计算 SQL Server 中的第 90 个百分位数

标签 sql sql-server percentile

我需要计算这样的值列表的第 90 个百分位数:

0.0099
0.0129
0.0031
0.0219
0.2632
0.0124
0.0493
0.05
0.0433

我将如何进行计算?我知道答案是0.0713,9 .有什么建议?
DECLARE @Temp TABLE(DATA float)

INSERT INTO @Temp VALUES(0.0099)
INSERT INTO @Temp VALUES(0.0129)
INSERT INTO @Temp VALUES(0.0031)
INSERT INTO @Temp VALUES(0.0219)
INSERT INTO @Temp VALUES(0.2632)
INSERT INTO @Temp VALUES(0.0124)
INSERT INTO @Temp VALUES(0.0493)
INSERT INTO @Temp VALUES(0.05) 
INSERT INTO @Temp VALUES(0.0433)

SELECT DATA
FROM @Temp
ORDER BY DATA ASC

--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

最佳答案

  • Source

  • A percentile (or a centile) is a measure used in statistics indicating the value below which a given percentage of observations in a group of observations fall. For example, the 20th percentile is the value (or score) below which 20 percent of the observations may be found.

    There is no standard definition of percentile



    最近排名方法:
    SELECT DATA
    FROM (
        SELECT 
            DATA, 
            COUNT(1) OVER (PARTITION BY NULL) As N, 
            ROW_NUMBER() OVER (ORDER BY DATA) AS i
        FROM @Temp) t
    WHERE
        i = ROUND(N * 90.00 / 100.00, 0, 0)
    

    最近秩之间的线性插值方法:
    DECLARE @P real = 90.00
    
    SELECT MAX(tt.Pv)
    FROM (
        SELECT 
            (CASE 
                WHEN i = k THEN DATA
                WHEN k = 0 AND P = MIN(CASE WHEN P > @P THEN P END) OVER (PARTITION BY NULL) THEN 
                    DATA + N * (@P - P) / 100 * (MIN(CASE WHEN P > @P THEN DATA END) OVER (PARTITION BY NULL) - DATA)
                ELSE 0
            END) AS Pv
        FROM (
            SELECT 
                *,
                100.00 / N * (i - 1.00 / 2.00) AS P,
                CASE
                    WHEN @P < 100.00 / N * (1 - 1.00 / 2.00) THEN 1 
                    WHEN @P > 100.00 / N * (N - 1.00 / 2.00) THEN N
                    WHEN @P = 100.00 / N * (i - 1.00 / 2.00) THEN i
                    WHEN @P > 100.00 / N * (i - 1.00 / 2.00) THEN i
                    ELSE 0
                END AS k
            FROM (
                SELECT 
                    DATA, 
                    COUNT(*) OVER (PARTITION BY NULL) As N, 
                    ROW_NUMBER() OVER (ORDER BY DATA) AS i
                FROM @Temp) ti) t
        ) tt;
    

    关于sql - 如何计算 SQL Server 中的第 90 个百分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30341793/

    相关文章:

    sql - 如何获取包含所有 dba 软件包描述的列表

    sql - MySQL - 选择连接整行

    sql - 如何处理 Where 中的 NULL?

    python - django 数据库更新值

    SQL Server : there are no primary or candidate keys in the referenced table that match the referencing column list in the foreign key 'FK'

    sql-server - 如何在 .cfc 文件中的一个 DELETE 语句中从多个表中删除?

    sql - Postgresql:获取百分位并计算每个图 block 中有多少个

    r - 从 gamlss 百分位曲线获取百分位值

    java - 通过 JDBC 连接到 MS SQL Server 引发 SQLServerException

    PHP/MySQL : how to dynamically change my (large and always changing) database