微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算十分位数的频率

如何解决计算十分位数的频率

假设我有详细描述马拉松比赛的 sql Server 表,所有这些表都一样。每一行是一个参与者,其中一列是完成时间,[dbo].[marathon_X].[finish]。为简单起见,我们假设 [finish] 以分钟 (int) 计算。

我被卡住了,可以帮助找出一个查询,将特定比赛的完成时间划分为十分位数,并计算每个十分位数内完成的参与者人数。这样我就可以了解不同时间段的频率分布(在这种情况下,我希望它不是偶数或正常的)。

例如,如果某场比赛的获胜者在 130 分钟后完成比赛,最后一名参赛者在 520 分钟后完成比赛,那么在该比赛中,每个完成时间的十分位数将为 (MAX(finish) - MIN(finish))/10 = 39 分钟宽。然后第一个十分位数将是 130-168 分钟内的完成时间,第二个将是 169-207 分钟,依此类推。然后我需要计算每个十分位数中的跑步者数量,其范围因比赛而异。

可能非常简单,但我还没有弄清楚如何 NTILE 这个(或等效的)。

解决方法

不确定您是否希望汇总最终结果,但这在最终选择中是小事。

cte 将创建所需的范围。那么把两组数据连接起来就变成小事了。

示例

Declare @YourTable table (Participant int,FinishTime int)
Insert Into @YourTable values
 (1,130)  -- Top,(2,510)  -- Last,(3,150)  -- Random ...,(4,255),(5,460),(6,325)

;with cte as (
      Select Decile,R1  = (MinV) + ( RngV * (Decile-1)) + (Decile-1),R2  = (MinV) + ( RngV * (Decile-1)) + (Decile-1) + RngV
       From  (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) A(Decile)
       Cross Join ( Select MinV = min(FinishTime),MaxV = max(FinishTime),RngV = (max(FinishTime)-min(FinishTime))/10  
                     From  @YourTable ) B
)
Select A.*,B.Decile
 From  @YourTable A
 Join  cte B on FinishTime between R1 and R2
 Order By FinishTime

结果

Participant FinishTime  Decile
1           130         1
3           150         1
4           255         4
6           325         6
5           460         9
2           510         10

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。