Per recuperare le righe in base alla percentuale del numero di righe in ogni gruppo è possibile utilizzare due funzioni della finestra:una per contare le righe e una per attribuire loro un numero univoco.
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;
Esempio di SQLFiddle:http://sqlfiddle.com/#!15/94fdd/1
A proposito:usando char
è quasi sempre una cattiva idea perché è un tipo di dati a lunghezza fissa che viene riempito alla lunghezza definita. Spero che tu l'abbia fatto solo per impostare l'esempio e non usarlo nella tua tabella reale.