我有一个表,表中的列id
、score
、parent_id
按score
排序,我问了here中的一个场景。
与上一个问题的不同之处在于parent_id可能会显示在多个行上,而不是必要的序列行上。
| 身份证|刻痕|父代标识|
| - ------|- ------|- ------|
| 小行星5859|十个|小行星5859|
| 小行星2157|九|小行星5859|
| 小行星21064|八个|小行星21064|
| 小行星5|七|小行星5|
| 小行星34384599|六个|小行星5|
| 小行星1675761|五个|小行星5859|
| 小行星3465729|四个|小行星3465729|
| 小行星401202|三个|小行星401203|
| 小行星1817458|第二章|小行星1817458|
我希望使用相同的顺序查询此表中的所有列,但将结果限制为至少5行,以满足等于5的唯一parent_id编号。因此,parent_id仅包含5个ID:5859、21064154、51992、3465729、401203
预期结果如下:
| 身份证|刻痕|父代标识|
| - ------|- ------|- ------|
| 小行星5859|十个|小行星5859|
| 小行星2157|九|小行星5859|
| 小行星21064|八个|小行星21064|
| 小行星5|七|小行星5|
| 小行星34384599|六个|小行星5|
| 小行星1675761|五个|小行星5859|
| 小行星3465729|四个|小行星3465729|
| 小行星401202|三个|小行星401203|
使用lag
的解决方案仅适用于具有相同parent_id值的下一行。如果使用Java,我们可以使用SET来存储parent_id,并对唯一的parent_id进行计数,但如何用SQL编写呢?
select id, score, parent_id
from (
select *, Sum(diff) over(order by score desc)seq
from (
select *,
case when Lag(parent_id) over(order by score desc) = parent_id then 0 else 1 end diff
from t
)t
)d
where seq <= 5
order by score desc;
2条答案
按热度按时间gjmwrych1#
也许这对您有用,这是一个现有查询的重构,但也是使用 exists 来代替 lag 的一种方法,它可以满足非连续行的需要,试试看吧:
lndjwyie2#
可以考虑的一种方法是:
您可以看到a Fiddle here。
WHERE
子句只是计算score
〉=当前行的不同parent_id
的数量。