0

这是LOCATION1表格:

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*  
.
.

现在,我想要一个列表,其中greatest loc_area包含每个loc_state和关联的loc_name. 因此,输出可能如下所示:

Loc_State     Loc_Name     Max(Loc_area)
IA              ABC           600
FL              GHI           900
NY              MNO           600

我认为它从以下开始,但我不知道这是否正确。

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_name相同的loc_statemax(loc_area)

假设IA中有一个CXY600*相同。loc_name loc_stateloc_area

所以输出可以同时具有 (IA, ABC, 600)(IA, CXY, 600)

我想这是可以接受的,因为 aloc_state可以有多个loc_area(s)具有相同值,在这种情况下为600但在不同的loc_name(s).

所以,问题解决了!

我认为 a_horse_with_no_name 的解决方案也可以正常工作。

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);

再次感谢!

4

1 回答 1

0

您最初的陈述已经完成了一半,但相关条件并不完全正确。而且您实际上并不需要内部查询中的INor the group by

所以你最初的陈述应该是这样的:

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;
于 2013-05-21T22:31:00.293 回答