Jag skulle föreslå att du beräknar en löpande procentsats med en fönsterfunktion och sedan jämför resultatet med 80.
I detta lilla kodexempel har jag visat hur man gör det baserat på resultatet av din fråga placerad i ett CTE-block som heter your_data
. Det visar bara idén.
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
Den returnerar faktiskt 3 rader och du säger att du förväntar dig att 4 rader ska visas. För att lägga till raden där löpprocenten först överskrider din gräns (80), kan du extrahera den aktuella kategoriprocenten från löpande värde, d.v.s. ersätta sum(percentage) over (order by category)
med sum(percentage) over (order by category) - percentage
.
HTH