【发布时间】:2017-12-07 13:10:30
【问题描述】:
我正在努力寻找解决方案,但没有成功。
在我的查询中,我选择了 count(*) 和 percentile_disc(.9) 来查找第 90 个位置。
情况是,当计数为 29 时,第 90 个百分位比 27 更接近数字 26,但仍返回第 27 个对象。
有什么办法可以说,如果 5
参考表
ID Count 90th
-------------------
1 50 45
2 40 36
3 27 25 <-- Should be 24
4 9 9 <-- Should be 8
90% 的 9 是 0.9,它应该删除 1 并得到 8。
---直到这里是我对第N个百分位数的理解---
现在我有什么:
我的表有条目丢失(每天 + 100k),所以我想每天运行这个查询。
Service_id start_time end_time
-------------------------------------
Service1 1499025651614 1499025651648
Service2 1499025655145 1499025655434
Service3 1499025656029 1499025656112
Service2 1499025658755 1499025659135
Service3 1499025726862 1499025728346
Service1 1499025748782 1499025750032
Service3 1499025749277 1499025749900
Service3 1499025757681 1499025758517
Service2 1499025775000 1499025775101
Service1 1499025785556 1499025785633
...
我有一个查询来选择每个服务的最小值、最大值和平均值
select mt.SERVICE_ID as SERVICE_ID,
count(*) as COUNT,
round(avg((mt.end_time - mt.start_time) / 1000), 2) as Avg,
round(min((mt.end_time - mt.start_time) / 1000), 2) AS Min,
round(max((mt.end_time - mt.start_time) / 1000), 2) AS Max
from myTable mt
group by mt.service_id
我想在使用连接之前合并讨论的第 90 个百分位。
select service_id, round(percentile_disc(.90) within group(order by elapsed), 2) as perc
from (select mt.service_id, ((mt.end_time - mt.start_time) / 1000) as elapsed
from myTable mt)
group by service_id
当计数为 9 时出现问题,在这种情况下,MAX 和 Perc 相同(由于百分位数没有删除任何内容)但在这种特殊情况下我需要删除最后一个,结果给我第 8 位的时间。
在这种情况下,有什么办法可以再删除一个位置?
【问题讨论】:
-
请提供minimal reproducible example,包括您的表的 DDL 语句、DML 语句(例如说明您的问题和预期输出的数据)(详细说明为什么需要该输出的逻辑) .目前,您问题中的文字描述与“参考表”不匹配,也不匹配您的查询,因此不清楚您要达到的目标。
-
@MT0 添加了更多数据,希望足以澄清。谢谢
标签: oracle percentile