一列中多个类别的最大值--oracle11g

一列中多个类别的最大值--oracle11g,oracle11g,sqlplus,Oracle11g,Sqlplus,以下是位置1表: Loc_id Loc_name Loc_state Loc_area 1 ABC IA 600 2 DEF FL 700 3 GHI FL 900 4 JKL IA 200 5 MNO

以下是
位置1
表:

Loc_id     Loc_name      Loc_state   Loc_area
1          ABC              IA         600
2          DEF              FL         700
3          GHI              FL         900
4          JKL              IA         200
5          MNO              NY         600
6          CXY              IA         600*  
.
.
现在,我想为每个
loc\u状态
和相关的
loc\u名称
创建一个带有
最大loc\u区域
的列表。因此,输出可以如下所示:

Loc_State     Loc_Name     Max(Loc_area)
IA              ABC           600
FL              GHI           900
NY              MNO           600
select loc_state, loc_name, loc_area
from location loc1
where loc_area = (select max(loc_area)
                  from location loc2
                  where loc1.loc_state = loc2.loc_state);
我认为它是从以下内容开始的,但我不知道这是否正确

SELECT LOC_STATE, LOC_NAME, LOC_AREA
FROM LOCATION1 LOC1
WHERE LOC_AREA IN (
SELECT MAX(LOC_AREA)
FROM LOCATION1 LOC2
HAVING LOC1.LOC_STATE = LOC2.LOC_STATE
GROUP BY LOC_STATE);
有人能帮我吗

谢谢

更新

上述查询提供了多个
loc\u名称
,它们具有相同的
loc\u状态
max(loc\u区域)

假设在IA
loc\u状态中有一个CXY
loc\u名称
,具有相同
loc\u区域
600*

因此,输出可以同时具有这两个属性
(IA,ABC,600)
(IA,CXY,600)

我想这是可以接受的,因为
loc\u状态
可以有多个
loc\u区域
具有相同的值,在这种情况下600,但在不同的
loc\u名称

所以,问题解决了

我认为一匹没有名字的马的解决方案也很好

select loc_state, loc_name, loc_area
from location1 loc1
where loc_area = (select max(loc_area)
                  from location1 loc2
                  where loc1.loc_state = loc2.loc_state);

再次感谢

您最初的陈述已经进行了一半,但相关条件并不完全正确。而且您实际上不需要
中的
,也不需要内部查询中的
分组依据

因此,您的初始声明可能如下所示:

Loc_State     Loc_Name     Max(Loc_area)
IA              ABC           600
FL              GHI           900
NY              MNO           600
select loc_state, loc_name, loc_area
from location loc1
where loc_area = (select max(loc_area)
                  from location loc2
                  where loc1.loc_state = loc2.loc_state);
一种替代方法是使用窗口函数避免查询表两次:

select loc_state, 
       loc_name,
       loc_area
from (
  select loc_state, 
         loc_name, 
         loc_area,
         dense_rank() over (partition by loc_state order by loc_area desc) as rnk
  from location
) t
where rnk = 1;

“我不知道这是否正确”:您运行它时发生了什么?您的查询非常正确:我尝试了此操作,但它不会返回每个loc_状态的最大值,尽管它返回不同的loc_状态。@anupk:您尝试了什么?第一句话还是第二句话?请向我们展示一些示例数据(编辑您的问题,不要将其放入注释中),这些数据表明它“不返回最大值”。据我所知,这两个函数都返回了您所要求的内容:@anupk:如果在第二个查询中使用
row\u number()
而不是
densite\u rank()
,您可以消除相同区域的“重复项”。为了获得一致的结果,您应该在窗口定义的
order by
中添加另一列,例如
order by loc\u area desc,name asc