计算MS SQL中的百分位数排名

Sol*_*nal 26 sql sql-server math

在MSSQL 2005中计算百分位数排名(例如第90百分位数或中位数分数)的最佳方法是什么?

我希望能够为单列评分选择第25个,中位数和第75个百分位数(最好是在单个记录中,这样我就可以将其与平均值,最大值和最小值结合起来).例如,结果的表输出可能是:

Group  MinScore  MaxScore  AvgScore  pct25  median  pct75
-----  --------  --------  --------  -----  ------  -----
T1     52        96        74        68     76      84
T2     48        98        74        68     75      85
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 15

我认为这将是最简单的解决方案:

SELECT TOP N PERCENT FROM TheTable ORDER BY TheScore DESC
Run Code Online (Sandbox Code Playgroud)

其中N =(100 - 期望百分位数).因此,如果您希望所有行都在第90个百分位,那么您将选择前10%.

我不确定你的意思是"最好是在一张唱片中".你的意思是计算单个记录的给定分数会落入哪个百分位数?例如,您是否希望能够发表"您的分数为83,这使您处于第91百分位数"的陈述.?

编辑:好的,我想到了更多关于你的问题,并想出了这个解释.您是否在询问如何计算特定百分位数的截止分数?例如:像这样:要达到90%,你必须得分大于78.

如果是,则此查询有效.我不喜欢子查询,所以根据它的用途,我可能会尝试找到更优雅的解决方案.但是,它会返回单个记录,只有一个分数.

-- Find the minimum score for all scores in the 90th percentile
SELECT Min(subq.TheScore) FROM
(SELECT TOP 10 PERCENT TheScore FROM TheTable
ORDER BY TheScore DESC) AS subq
Run Code Online (Sandbox Code Playgroud)


小智 9

查看NTILE命令 - 它会非常容易地为您提供百分位数!

SELECT  SalesOrderID, 
    OrderQty,
    RowNum = Row_Number() OVER(Order By OrderQty),
    Rnk = RANK() OVER(ORDER BY OrderQty),
    DenseRnk = DENSE_RANK() OVER(ORDER BY OrderQty),
    NTile4  = NTILE(4) OVER(ORDER BY OrderQty)
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID IN (43689, 63181)
Run Code Online (Sandbox Code Playgroud)


小智 0

我可能会使用 sql server 2005

row_number() over (按分数排序) / (从分数中选择 count(*))

或类似的规定。