Proponuję obliczyć bieżący procent za pomocą funkcji okna, a następnie porównać wynik z 80.
W tym małym przykładzie kodu pokazałem, jak to zrobić na podstawie wyniku zapytania umieszczonego w bloku CTE o nazwie your_data
. Po prostu pokazuje Ci pomysł.
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
W rzeczywistości zwraca 3 wiersze i mówisz, że oczekujesz wyświetlenia 4 wierszy. Aby dodać wiersz, w którym procent bieżący najpierw przekracza twoją granicę (80), możesz wyodrębnić procent bieżącej kategorii z wartości bieżącej, tj. zastąpić sum(percentage) over (order by category)
z sum(percentage) over (order by category) - percentage
.
HTH