For at hente rækkerne baseret på procentdelen af antallet af rækker i hver gruppe kan du bruge to vinduesfunktioner:en til at tælle rækkerne og en til at give dem et unikt nummer.
select gp,
val
from (
select gp,
val,
count(*) over (partition by gp) as cnt,
row_number() over (partition by gp order by val desc) as rn
from temp
) t
where rn / cnt <= 0.75;
SQLFiddle-eksempel:http://sqlfiddle.com/#!15/94fdd/1
Btw:ved at bruge char
er næsten altid en dårlig idé, fordi det er en datatype med fast længde, der er polstret til den definerede længde. Jeg håber, at du kun gjorde det for at opsætte eksemplet og ikke bruger det i din rigtige tabel.