Это сложно в «традиционном» SQLite. Я бы порекомендовал union all
:
with top1 as (
select t.*
from t
order by points desc
limit 1
)
select t.*
from t
where t.position = (select t1.position from top1 t1)
union all
select t.*
from t
where t.position <> (select t1.position from top1 t1) and
(select count(*)
from t t2
where t2.position = t.position and
t2.points >= t.points
) <= 2;
Предполагается, что значения points
являются уникальными. Связи гораздо сложнее в SQLite.
Я мог бы порекомендовать вам перейти на SQLite версии 3.25.0 или использовать другую базу данных. Такой запрос будет намного проще, если использовать стандартные оконные функции ISO / ANSI.
С оконными функциями это будет выглядеть так:
select t.*
from (select t.*,
row_number() over (partition by position order by points desc) as seqnum,
first_value(position) over (order by points desc) as first_position
from t
) t
where seqnum <= 2 or position = first_position