计算十分位数的频率
Calculate frequencies over deciles
假设我有 SQL 个详细描述马拉松比赛的服务器表格,所有表格都相似。每行是一个参与者,其中一列是完成时间,[dbo].[marathon_X].[finish]。为简单起见,我们假设 [finish] 以分钟 (int) 计算。
我被困住了,可以使用帮助找出一个查询,将某场比赛的完成时间划分为十分位数,并计算每个十分位数内完成比赛的参与者人数。这样我就可以了解不同时间段的频率分布(在这种情况下,我希望它不是均匀的,也不是正常的)。
因此,例如,如果某场比赛的获胜者在 130 分钟后完赛,而最后一名参赛者在 520 分钟后完赛,那么在该特定比赛中,每个完赛时间等分位数将为 (MAX(finish) - MIN(finish))/ 10 = 39 分钟宽。然后第一个十分位数是 130-168 分钟内的完成时间,第二个是 169-207 分钟,等等。然后我需要计算每个十分位数中的跑步者人数,其范围因比赛而异。
可能非常简单,但我还没有想出如何 NTILE 这个(或等效的)。
不确定您是否希望汇总最终结果,但这在最终 select 中是一件小事。
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
假设我有 SQL 个详细描述马拉松比赛的服务器表格,所有表格都相似。每行是一个参与者,其中一列是完成时间,[dbo].[marathon_X].[finish]。为简单起见,我们假设 [finish] 以分钟 (int) 计算。
我被困住了,可以使用帮助找出一个查询,将某场比赛的完成时间划分为十分位数,并计算每个十分位数内完成比赛的参与者人数。这样我就可以了解不同时间段的频率分布(在这种情况下,我希望它不是均匀的,也不是正常的)。
因此,例如,如果某场比赛的获胜者在 130 分钟后完赛,而最后一名参赛者在 520 分钟后完赛,那么在该特定比赛中,每个完赛时间等分位数将为 (MAX(finish) - MIN(finish))/ 10 = 39 分钟宽。然后第一个十分位数是 130-168 分钟内的完成时间,第二个是 169-207 分钟,等等。然后我需要计算每个十分位数中的跑步者人数,其范围因比赛而异。
可能非常简单,但我还没有想出如何 NTILE 这个(或等效的)。
不确定您是否希望汇总最终结果,但这在最终 select 中是一件小事。
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