如何计算 SQL 中数据的 90th Percentile、SD、Mean

Posted

技术标签:

【中文标题】如何计算 SQL 中数据的 90th Percentile、SD、Mean【英文标题】:How to calculate 90th Percentile, SD, Mean for data in SQL 【发布时间】:2015-11-17 19:49:12 【问题描述】:

您好,我有一个餐桌设施。每天都有一个分数(每天可以报告多个分数,并且两个都有效)

我需要按月计算分数的第 90 个百分位、SD 和平均值。

设施:

Id   Month Date  score
1    Jan     1    5
1    Jan     1    5
1    Jan     2    3
1    Jan     3    4
1    Jan     4    4
1    Jan     5    4
1    Feb     1    5
1    Feb     1    5
1    Feb     2    3
1    Feb     3    4
1    Feb     4    4
1    Feb     5    4

有什么办法吗?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以使用 SQL Server 2012 中引入的新分析函数套件:

SELECT DISTINCT
            [Month],
            Mean   = AVG(Score) OVER (PARTITION BY [Month]),
            StdDev = STDEV(Score) OVER (PARTITION BY [Month]),
            P90    = PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY Score) OVER (PARTITION BY [Month])
FROM        my_table

有 2 个百分位函数:PERCENTILE_CONT 用于连续分布,PERCENTILE_DISC 用于离散分布。选择一个适合您的需求。

【讨论】:

哦,PERCENTILE_CONT - 这对我来说是新的,看起来值得学习。不错 - 赢得了我的支持。 我收到错误:当前兼容模式下不允许使用 PERCENTILE_CONT 函数。仅允许在 110 或更高模式下使用。 所以您正在运行 SQL Server 2012 但处于旧模式?检查this page 了解如何更改它 它工作了。我作为组的一部分拥有数据阅读器的权限,但是当我们的管理员将我添加为个人用户时,我能够运行它。我无法告诉你它对我有多大帮助。再次感谢。【参考方案2】:

这是设置...

CREATE TABLE Facility (Id INT NOT NULL, Month nvarchar(3) NOT NULL, Date INT NOT NULL, score INT NOT NULL)

INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Jan', 1, 5)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Jan', 1, 5)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Jan', 2, 3)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Jan', 3, 4)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Jan', 4, 4)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Jan', 5, 4)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Feb', 1, 5)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Feb', 1, 5)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Feb', 2, 3)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Feb', 3, 4)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Feb', 4, 4)
INSERT INTO Facility (Id, Month, Date, score) VALUES (1, 'Feb', 5, 4)

现在,标准偏差和均值已经足够简单了——它们内置了聚合函数...

SELECT
    [Month],
    AVG(CONVERT(real, score)) AS [Mean],
    STDEV(score) AS [Standard Deviation]
FROM
    Facility
GROUP BY
    [Month]

对于第 90 个百分位,您需要发明一个函数...

CREATE FUNCTION NintythPercentile(@Month nvarchar(3)) RETURNS INT AS
BEGIN
    DECLARE @ReturnValue INT

    SELECT 
        @ReturnValue = MIN(DerivedTopTenPercent.score) --AS [90th Percentile]
    FROM
        (
        SELECT TOP 10 PERCENT
            score
        FROM
            Facility
        WHERE
            [Month] = @Month
        ORDER BY
            score DESC
        ) DerivedTopTenPercent

    RETURN @ReturnValue
END

使用该函数,您的最终查询将如下所示...

SELECT
    [Month],
    AVG(CONVERT(real, score)) AS [Mean],
    STDEV(score) AS [Standard Deviation],
    dbo.NintythPercentile([Month]) AS [90th Percentile]
FROM
    Facility
GROUP BY
    [Month]

【讨论】:

抱歉无法创建函数

以上是关于如何计算 SQL 中数据的 90th Percentile、SD、Mean的主要内容,如果未能解决你的问题,请参考以下文章

如何计算表中一个字段的总和并将其放入输入中

计算分层 SQL 数据中的子项数

sql怎么将一系列点经纬度坐标匹配到某市

SQL函数计算流量的95值

sql计算机系的平均成绩为多少?

sql行变列的思路