SQL:获取最大列值对应的列值
我有下表 我的桌子SQL:获取最大列值对应的列值,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我有下表 我的桌子 Id | S_Id | T_Id | 1 | 1 | abc | 2 | 2 | abc | 3 | 3 | abc | 4 | 4 | abc | 5 | 1 | xyz | 6 | 2 | xyz | 7 | 3 | xyz | 我还有一张桌子,另一张桌子 P_Id | Name | Id | 1 | pqr | 4 | 2 | stu | 4 |
Id | S_Id | T_Id |
1 | 1 | abc |
2 | 2 | abc |
3 | 3 | abc |
4 | 4 | abc |
5 | 1 | xyz |
6 | 2 | xyz |
7 | 3 | xyz |
我还有一张桌子,另一张桌子
P_Id | Name | Id |
1 | pqr | 4 |
2 | stu | 4 |
3 | mvc | 4 |
4 | yxf | 3 |
我将有T_Id作为输入,例如:abc。我需要一个查询来选择具有最大S_Id(即4)的行的Id,并与另一个表联接,结果是:
Id | S_Id | T_Id | P_Id | Name |
4 | 4 | abc | 1 | pqr |
4 | 4 | abc | 2 | stu |
4 | 4 | abc | 3 | mvc |
感谢您的帮助。如果您使用的是11g或之前的版本,请使用rank()
窗口功能
select id
from (
select id, rank() over (partition by T_Id order by S_Id desc) as rn
from myTable
where T_Id = 'abc') t
where t.rn = 1;
在12c上,您可以使用fetch
select id
from myTable
where T_Id = 'abc'
order by S_Id desc
fetch first 1 row;
根据您的新需求使用Join
select t.Id, t.S_Id, t.T_Id, t1.P_Id, t1.Name
from (
select id, S_id, t_id rank() over (partition by T_Id order by S_Id desc) as rn
from myTable
where T_Id = 'abc') t join AnotherTable t1 on t.id = t1.P_id
where t.rn = 1;
谢谢它起作用了。但除了排名,还有其他选择吗。因为我希望它在需要时在每个数据库上运行。@SonamDaultani每个Oracle数据库?我认为Rank()从8i开始工作,我指的是所有oracle版本。我检查了它是否适用于8i以上的所有版本。感谢您的建议。
rank()
vsfetch first
的结果可能会有所不同,如果最大S\u Id
的结果相同(如果S\u Id
可能有重复项,否则这不是问题)。如果可以重复,并且您确实只需要一行,则可以使用行数()
而不是秩()
(例如,对于标量子查询)。@vercelli我的要求已更改。你能调查一下吗。