一列中多个类别的最大值--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区域)
假设在IAloc\u状态中有一个CXYloc\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
。