如何计算 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的主要内容,如果未能解决你的问题,请参考以下文章