我有一个表格,其中包含一个名为Score
的特定数字列。我想在该表上执行一个查询,其结果将有100行,每行代表与该百分位对应的分数。例如,结果可能如下所示:
Percentile | Score
---------------------
01 | 10
02 | 12
03 | 12
04 | 17
... | ...
99 | 1684
100 | 1685
上面结果表中的分数值是原始表中存在的实际分数值,并且未进行插值。插值结果会更好,但不是必需的。
可能有几种启发式方法可以产生这样的结果。我今天使用的(在代码中)基本如下 - 与百分位数对应的分数值将是分数值,其中:分数较小的行数除以总行数,四舍五入为整数,等于百分位数(我希望很清楚)
我可以考虑其他启发式方法,如果它们更容易实现
我正在使用MS-SQL,但我很欣赏也适用于MySQL的解决方案。
实现这一目标的最佳方式是什么?
答案 0 :(得分:5)
在SQL Server
:
SELECT percentile, score
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY percentile ORDER BY score) AS rn, percentile, score
FROM (
SELECT score, NTILE(100) OVER (ORDER BY score) AS percentile
FROM mytable
) q
) q2
WHERE rn = 1