所以我有一张基本上是树的桌子。每一行在同一个表中有一个父级,一个lvl列告诉我树中的级别,root是lvl = 0.现在说我要选择所有名称以A开头的行,但只有那些这是该组中最高级别的。因此树可能有9个级别,但包含名称以A开头的行的最高级别可能在级别7上,因此我希望级别7上的所有行都以A开头(忽略较低级别的行)。我可以这样做:
select id, name, lvl
from my_table
where name like 'A%'
and lvl = (select max(lvl) from my_table
where name like 'A%')
这个问题是我想要做一些比用A开头的行更复杂的东西,所以条件会有更多的子句,而select和subselect也会有一些连接,并且我不想重复自己。特别是因为我将来可能需要修改它,我担心我可能会忘记其中一个选项中的一些条款。
这样有一种更简单的方法,无需重复选择,即可获得最高水平。
答案 0 :(得分:5)
Analytics可能会对您有所帮助:
SELECT ID, NAME, rn
FROM (SELECT id, NAME, rank() over(ORDER BY LVL DESC) rn
FROM my_table
WHERE NAME LIKE 'A%')
WHERE rn = 1
作为额外的好处,在大多数情况下,删除自联接将是性能提升。