oracle 获取列的MAX并再添加一个

w8biq8rn  于 2022-12-18  发布在  Oracle
关注(0)|答案(3)|浏览(164)

我正在尝试进行一个SQL查询,该查询将从一列及其相应的ID中返回最大的数字。有关详细信息,我有两个列ID和NUMBER。它们都有2个条目,我希望获得ID旁边的最大数字。这是我尝试过的,但没有成功。

SELECT ID, MAX(NUMBER) AS MAXNUMB
FROM TABLE1
GROUP BY ID, MAXNUMB;

我遇到的问题是,它只显示所有条目,如果我添加一个“where”表达式,它只显示相同的(所有条目[id +numbers])。
Pd.:是的,我得到了我想要的,但只有一列(数字),如果我添加另一列(ID)来选择它“brokes”。

qvtsj1bj

qvtsj1bj1#

试试看:

SELECT 
  ID, 
  A_NUMBER
FROM TABLE1
WHERE A_NUMBER = (
  SELECT MAX(A_NUMBER)
  FROM TABLE1);

假设您想要具有最大编号的行的ID *(而不是 each ID的最大编号--例如,如果ID在表中不是唯一的)。

  • 如果有两个或多个ID具有相等的最大编号,则可能会返回多个ID
fcipmucu

fcipmucu2#

你可以试试这个

Select ID,maxNumber
From 
(
    SELECT 
    ID, 
    (Select Max(NUMBER) from Tmp where Id = t.Id) maxNumber
FROM 
    Tmp t
)T1
Group By ID,maxNumber
1hdlvixo

1hdlvixo3#

您发布的查询包含非法列名(number),并且按最大值的别名分组,这是非法的,也没有意义;并且您也不能将无别名的max()包含在group-by中。因此,您实际上很可能正在执行以下操作:

select id, max(numb) as maxnumb
from table1
group by id;

这将为每个ID给予一行,每个ID的最大值为numb(这是我为数字列创建的新名称)。或者,正如您所说,您将得到“所有条目”,您可能会得到group by id, numb,这将显示表中的所有行(除非存在重复组合)。
要获得最大值numb和对应的id,可以只返回group by id,按maxnumb降序排序,然后只返回第一行:

select id, max(numb) as maxnumb
from table1
group by id
order by maxnumb desc
fetch first 1 row only

如果有两个ID具有相同的maxnumb,那么您将只得到其中一个-并且除非您修改order by,否则哪个ID是不确定的-但是在这种情况下,您可能更喜欢使用first 1 row with ties来查看所有ID。
您可以使用子查询和分析函数来生成排名,并让外部查询返回排名最高的行,从而实现同样的效果:

select id, numb as maxnumb
from (
  select id, numb, dense_rank() over (order by numb desc) as rnk
  from table1
)
where rnk = 1


您也可以使用keep来获得与first 1 row only相同的结果:

select max(id) keep (dense_rank last order by numb) as id, max(numb) as maxnumb
from table1

fiddle

相关问题