在Oracle中查找每组95%的值

时间:2015-02-11 16:40:25

标签: sql oracle

我有这样的数据表(表实际上包含数千行)

Group   Value
A           1
B           2
C           4
A           7
A           8
B           3
C           8
A           6
B           8
C           8

我需要找到每组95%的价值。

例如,如果组A包含1000行,那么我需要返回950行(1000 * 95%)。

这可能吗?

1 个答案:

答案 0 :(得分:3)

你可以使用NTILE()将结果集拆分成桶 - 95%分成20个桶并取1-19。以下查询将按升序值的顺序为每个组提供20个存储桶。

with ordered_data as (
select a.*, ntile(20) over (partition by g order by v) as n
  from the_data a
       )
select g, v
  from ordered_data
 where n <= 19

SQL Fiddle

如果您没有明确的订单,那么丢弃的5%的行将是任意的 - 这对您来说无关紧要,在这种情况下将其删除。

如果您不希望每个组,可能更容易计算行数,然后将返回的行数限制为计数的百分比:

with ordered_data as (
select a.*, count(*) over () as ct
  from <your_table> a
 order by v
       )
select g, v
  from ordered_data
 where rownum <= 0.95 * ct

SQL Fiddle

虽然在这里向COUNT()添加分区子句会产生类似的效果,即count(*) over (partition by g)