【问题标题】:Calculate frequencies over deciles计算十分位数的频率
【发布时间】:2021-06-11 02:03:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • NTILE 将按值将输出分成大小大致相等的组。它不会将时间范围划分为数据集的域中的 10 个等长值。因此,欢迎您使用标量逻辑和聚合 + OVER() 子句的 min + max 如您所描述的那样执行该逻辑,但是今天 SQL Server 中没有简单的函数可以执行此操作。
  • 有趣的问题,干得好。

标签: sql-server tsql frequency quantile


【解决方案1】:

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

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

【讨论】:

  • 哇...这很优雅。我只需要得到输出中指定的实际范围/十分位数,我可以解决这个问题。接下来我可以利用它来获取接下来需要编写的一些类似查询。无论如何,在我的样本中,分布结果出奇地奇怪(当然这不是马拉松比赛)。超高曲线。值得思考的事情。
  • @Greyhound 只需在最后的 SELECT 中包含 R1 和 R2
猜你喜欢
  • 2023-03-30
  • 2014-01-17
  • 2016-12-04
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2016-04-04
  • 2014-06-17
  • 1970-01-01
相关资源
最近更新 更多