sql-server - 计算十分位数的频率

标签 sql-server t-sql frequency quantile

假设我有详细说明马拉松比赛的 SQL Server 表,所有这些表都是相似的。每行都是一个参与者,其中一列是结束时间,[dbo].[marathon_X].[finish]。为了简单起见,我们假设 [finish] 以分钟 (int) 为单位计算。

我陷入困境,需要帮助找出一个查询,将某场比赛的完成时间划分为十分位数,并计算每个十分位数内完成比赛的参与者数量。这样我就可以了解不同时间段的频率分布(在这种情况下,我希望它不是均匀的或正常的)。

例如,如果某场比赛的获胜者在 130 分钟后完成比赛,最后一名参赛者在 520 分钟后完成比赛,那么在该特定比赛中,每个完成时间十分位数将为 (MAX(完成) - MIN(完成))/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

关于sql-server - 计算十分位数的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67925299/

相关文章:

sql-server - 创建临时表并同时存储执行命令的结果

sql - 使用 xp_cmdshell 的 T-SQL FTP

Python - 我的频率函数效率低下

ios - Swift FFT - 复杂的拆分问题

sql-server - 为什么从 int 进行强制转换/转换会返回星号

c# - 为什么在LINQ查询中调用方法时不能使用范围值的属性作为参数?

sql - MS Sql Server 2012 的查询优化

python - 仅使用 numpy 和 pandas 计算转换矩阵中每个单词的频率

sql - 在 select 语句中使用表值函数返回值

sql-server - 用于生产的 SQL Express?