Jeg vil foreslå at beregne en kørende procentdel ved hjælp af en vinduesfunktion og derefter sammenligne resultatet med 80.
I dette lille kodeeksempel har jeg vist, hvordan man gør det baseret på resultatet af din forespørgsel placeret i en CTE-blok kaldet your_data
. Det viser dig bare ideen.
with
your_data (category, percentage) as(
-- sample data based on your example
select 1, 32 from dual union
select 2, 20 from dual union
select 3, 20 from dual union
select 4, 10 from dual union
select 5, 18 from dual
),
t as (
select your_data.*,
-- running sum calculation
sum(percentage) over (order by category) pctg_running
from your_data
)
select *
from t
where pctg_running <= 80
Faktisk returnerer den 3 rækker, og du siger, at du forventer, at 4 rækker vises. For at tilføje rækken, hvor køreprocenten først overstiger din grænse (80), kan du udtrække den aktuelle kategoriprocent fra den løbende værdi, dvs. erstatte sum(percentage) over (order by category)
med sum(percentage) over (order by category) - percentage
.
HTH