我有一个表,列id
,score
,parent_id
按score
排序。我在这里问了一个场景。
与前面的问题不同的是,parent_id可能出现在多个行中,而不是必要的序列行。更新后的表:
<表类>
id
得分
parent_id
tbody><<tr>5859 10 5859 2157043 9 5859 21064154 8 21064154 51992 7 51992 34384599 6 51992 1675761 5 5859 3465729 4 3465729 401202 3 401203 1817458 2 1817458 表类>
也许这将为您工作,重构您现有的查询,但替代滞后使用存在,这迎合了非顺序行,给这个尝试:
select id, score, parent_id
from (
select *, Sum(keep) over (order by score desc) seq
from (
select *,
case when exists (
select * from t t2
where t2.parent_id = t.parent_id and t2.score > t.score
) then 0 else 1 end keep
from t
)t
)s
where seq <= 5
order by score desc;
一个可以考虑的方法是:
SELECT t1.*
FROM t t1
WHERE
(SELECT count(distinct parent_id)
FROM t t2
WHERE t2.score >= t1.score) <= 5
你可以在这里看到小提琴。WHERE
子句只是计算具有score
>=当前行的不同parent_id
的个数。