我有这样的数据表(表实际上包含数千行)
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%)。
这可能吗?
答案 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
如果您没有明确的订单,那么丢弃的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
虽然在这里向COUNT()
添加分区子句会产生类似的效果,即count(*) over (partition by g)