Использовать оконные функции:
select t.*,
(case when seqnum < num * 0.2 as 'A'
when seqnum < num * 0.5 as 'B'
else 'C'
end) as grp
from (select t.*,
rank() over (order by skiped_times desc) as seqnum,
count(*) over () as num
from t
) t;
Примечание. Использование rank()
означает, что значения со связями помещаются в одну группу. Если они могут быть разделены между группами, тогда используйте row_number()
.
РЕДАКТИРОВАТЬ:
Если вы хотите это с помощью sum значений - ну, сначала вы должны бытьясно в вопросе, а не в комментарии. Вы можете использовать ту же идею:
select t.*,
(case when running_sum < total * 0.2 as 'A'
when running_sum < total * 0.5 as 'B'
else 'C'
end) as grp
from (select t.*,
sum(skiped_times) over (order by skiped_times desc) as running_sum,
sum(skiped_times) over () as total
from t
) t;