0

例如,我有以下调用列表:

  • 呼叫#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) Hot 获取第80% 条记录的时长(按通话时长排序)。例如,如果有 500 条记录,那么第 400 条记录的持续时间是多少?

这个 SQL 查询应该是什么样子(Oracle)?

4

1 回答 1

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,那么行限制子句的功能升级非常大,您可以获得实际百分比,例如:

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

这将按列DURATION升序的顺序选择前 80% 的行,但其中有接受所有这些记录的并列记录。使用only而不是with ties只返回指定的百分比。

有很多选项,这篇博文也很好地解释了这些选项。


要计算出平均通话持续时间为 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
于 2015-03-24T08:22:20.300 回答