SQL查找哪个百分比

SQL查找哪个百分比,sql,sql-server,Sql,Sql Server,我试图找出赛跑运动员终点位置的哪个百分位,最终我想在这样的查询中使用它: 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中执

我试图找出赛跑运动员终点位置的哪个百分位,最终我想在这样的查询中使用它:

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
Public Shared Function Get_Percentile(ByVal作为整数,position作为整数)作为Double
将SMPLTST分数(跑步者)调整为整数
对于i=1的跑步者
SMPLTST分数(i)=i
下一个
将smplData调整为IEnumerable(整数的)=SMPLTSTCORES.OrderBy(函数(n)n)
Dim scoresLess As Integer=smplData.Count(函数(n)n<位置)
Dim p As Double=数学圆(无分数/SMPLTSTCORES.Length*100)'百分位数
返回p
端函数

那么基本上是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))
编辑以添加: 我理解这里的目标是执行更新声明,向第50百分位以上的竞争对手,即或多或少高于中位数的竞争对手,授予比低于中位数的竞争对手更高的分数。如果你真的想要最终结果中的百分位数,你确实需要做更多的事情

我最初没有看到SQL Server的标记。SQL Server绝对不是我的第一语言;但我希望你觉得这些建议有用。SQL Server提供了包含精细添加百分比和关系的TOP子句。这些对你来说真的很方便!如果你真的需要百分位数,百分排名看起来是一个不错的选择!过去的答案看起来像最简单的中位数:


原始答复: 如前所述,要解决您的问题,您不需要百分位数,只需要中位数。前面的答案为您提供了实现这一点的方法:

根据您的来去,一些SQL的选择。。。LIMIT子句还允许您指定偏移量,这意味着您可以从中间选择一条记录。(对不起,您必须搜索“限制”。)


在大多数情况下,我认为通过平均中间两个值来计算偶数个值的中值的好区别是不值得的。也许您的用例正在赢得一场更大的竞争,其中公平性要求精确性。不过,在这种情况下,我认为你必须回答的问题是,如果在50%时出现平局,会发生什么。例如,比赛中有十名选手并排穿过终点线

我不太清楚你在这里想做什么。你是说你有10名跑步者,而这个人排在第三位?如果是这样的话,你想计算什么?我想计算10名跑步者中的百分位。我的VB函数将其报告为27,这听起来很正确,即它在前30%的跑步者中排名靠前。百分位数通常与你的报告方式相反。第一名的选手将在第100百分位。最后一名的跑步者将处于第0百分位。第三名的跑步者将在第70百分位实际上你是对的,我通过从100中减去VB函数返回的值来找到这个百分位,所以在这种情况下它将是73。不,我不认为它像除以另一个那样简单,返回0.3,anser应该是27。我不明白。第三名27名10名跑步者怎么样?我不确定,我从另一篇文章中复制了VB代码,我只需要一些做同样事情的SQL!当你将3作为位置传递,10作为跑步者数量传递时,VB代码不可能返回27。这是一种非常复杂的方式,但这种逻辑只需要7/10就可以实现。不管你如何划分它。7我不认为这是我所追求的中位数,我试图复制的VB代码中的注释是百分位。这个答案是针对MySql的,这个问题显然是用sql server标记的。