例如,我有以下呼叫列表:
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)?
答案 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