SQL查找百分比



我正试图找到一名跑步者在比赛中终点位置的哪个百分比,最终我想在这样的查询中使用它:

Percentile(runners/placing) = "Percentile of the runner who came in 3rd place out of 10 runners = 27" 
UPDATE Scores SET ScoreFinal = (IIF(Percentile >= 50, Score * 2, Score * 3))

我目前正在使用一系列VB代码来查找百分比,不确定如何在SQL:中做到这一点

Public Shared Function Get_Percentile(ByVal runners As Integer, position As Integer) As Double
Dim smplTstScores(runners) As Integer
For i = 1 To runners
smplTstScores(i) = i
Next
Dim smplData As IEnumerable(Of Integer) = smplTstScores.OrderBy(Function(n) n)
Dim scoresLess As Integer = smplData.Count(Function(n) n < position)
Dim p As Double = Math.Round(scoresLess / smplTstScores.Length * 100) 'the percentile
Return p
End Function

所以基本上是3/10?在sql中,您必须小心,因为由于整数除法,这将始终返回0。只需将任一值乘以1.0

看看这个例子,明白我的意思。

declare @Position int = 3
, @Runners int = 10
select @Position / @Runners --integer math will use whole numbers
, @Position / (@Runners * 1.0) --multiplying by 1.0 forces this to decimal division.

我认为第三名应该是70%。因此,要实现这一点,只需使用:

1 - (@Position / (@Runners * 1.0))

编辑以添加:我理解这里的目标是执行一个UPDATE语句,将更多的分数授予超过第50百分位的竞争对手,也就是说,或多或少地,高于中位数,而不是低于中位数的竞争对手。如果你真的想在最终结果中获得百分位,你确实需要做更多的事情。

我最初没有看到SQL Server的标记。SQL Server绝对不是我的第一语言;但我希望你觉得这些建议有用。SQL Server提供了带有精细加法PERCENT和with TIES的TOP子句。这些对你来说真的很方便!https://learn.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15如果你真的需要百分位数,那么PERCENT_RANK看起来就是最好的选择!https://learn.microsoft.com/en-us/sql/t-sql/functions/percent-rank-transact-sql?view=sql-server-ver15这个过去的答案看起来像最简单的中位数:SQL server 中计算中位数的函数


原始答案:为了解决你的问题,你不需要百分位数,只需要中位数。前面的答案为您提供了获得该答案的方法:使用MySQL 计算中值的简单方法

根据您的来龙去脉,一些SQL的SELECT。。。LIMIT子句还允许您指定偏移量,这意味着您可以从中间选择一条记录。https://dev.mysql.com/doc/refman/8.0/en/select.html(对不起,您必须搜索"LIMIT"。(

在大多数情况下,我认为通过对中间两个值取平均值来计算偶数个值的中值的良好区别是不值得的。也许你的用例是在一个更大的竞争中得分,公平要求准确。不过,在这种情况下,我认为你必须回答的问题是,如果50%的交易量持平,会发生什么。例如,比赛中有十名选手并排冲过终点线!

最新更新