前80%记录的平均持续时间

时间:2015-03-24 08:15:06

标签: sql oracle top-n

例如,我有以下呼叫列表:

  • 致电#1 - 持续时间30分钟
  • 致电#2 - 持续时间43分钟
  • 致电#3 - 持续时间26分钟
  • 致电#4 - 持续时间35分钟
  • 致电#5 - 持续时间39分钟

1)我需要SQL查询检索前80%的通话平均持续时间

属于前80%的呼叫(根据呼叫持续时间)是呼叫#3,#1,#4,#5。对于这些呼叫,应计算平均持续时间((26 + 30 + 35 + 39)/ 4 = 32,5)。应忽略超过80%的呼叫(此处称为#2)。

2)此外,我还需要相反的查询 - 首次通话的百分比将使平均通话时间为30分钟

3)热获取持续时间为80%的记录(根据呼叫持续时间排序)。例如。如果有500条记录,那么第400条记录的持续时间是多少?

这个SQL查询应该如何(Oracle)?

1 个答案:

答案 0 :(得分:3)

NTILE()函数将数据集拆分为存储桶;将前80%分为5并进入前4:

select avg(duration)
  from ( select duration, ntile(5) over (order by duration) as bucket
           from ...
                )
 where bucket <= 4

如果您正在使用Oracle 12c,那么row limiting clause已经进行了大规模的功能升级,您可以获得实际的百分比,例如:

select avg(duration)
  from ...
 order by duration
 fetch first 80 percent rows with ties

这将按列DURATION升序排列的前80%行进行选择,但是有绑定记录接受所有行。使用only代替with ties仅返回指定的百分比。

有很多选项,this blog post也很好地解释了。


要计算出呼叫持续时间为30分钟的呼叫百分比,您需要知道运行平均值,运行计数和表中的总行数。对于运行平均值,分析AVG()应该有效,分析COUNT()表示总行数:

select max(running_count) / max(total_calls)
  from ( select duration
              , count(*) over () as total_calls
              , row_number() over (order by duration) as running_count
              , avg(duration) over (order by duration) as running_avg
           from ...
                )
 where running_avg <= 30