我试图获得下表中每个id的最大区域:
id name area 1001 Land AA 0.55 1001 Land AB 0.55 1001 Land AC 0.25 1001 Land AD 0.1 1002 Land BA 1 1002 Land BB 0.8 1002 Land BC 0.4 1003 Land CA 0.65 1003 Land CB 0.22 1003 Land CC 0.22
但是,如果数据包含具有两个或更多最大值的值,该怎么办?例如,1001有2行具有其最大值。当我使用此查询时: SELECT id,name,max(area)FROM land GROUP BY id
id name max(area) 1001 Land AA 0.55 1002 Land BA 1 1003 Land CA 0.65
期望的结果:
id name area 1001 Land AA 0.55 1001 Land AB 0.55 1002 Land BA 1 1003 Land CA 0.65
提前致谢。请告诉我,如果这个问题有重复,我无法搜索,因为我不知道如何用文字解释或使用什么搜索查询。再次感谢。
答案 0 :(得分:0)
您需要使用join
或其他条件执行此操作。这是一种典型的方法:
select l.*
from land l join
(select id, max(area) as maxarea
from land l
group by id
) lid
on l.id = lid.id and l.area = lid.maxarea;
另一种有时更有效的方法是使用not exists
:
select l.*
from land l
where not exists (select 1 from land l2 where l2.id = l.id and l2.area > l.area);
也就是说,从land
获取所有行,其中没有相应的行具有相同的id
和更大的area
。
最后,您的查询:
SELECT id, name, max(area)
FROM land
GROUP BY id;
不按照您的想法行事。 name
不是来自最大id
的行。它来自每个id
的任意(技术上“不确定”)行。这使用了group by
扩展名,其中记录了here。在其他数据库中,这将生成语法错误。我建议你避免使用这个扩展,直到你明白它真正在做什么。也就是说,确保聚合查询中未使用聚合函数的所有列也在group by
中(在您的查询中,name
不在group by
)。