查找一个城市中年龄最大的人的名字

  • 本文关键字:城市 一个 查找 sql
  • 更新时间 :
  • 英文 :


下面的查询将给出一个城市的平均年龄和居民人数的结果。分组BY应用于城市和聚合函数,居民为Count,年龄为AVG。

select city, count(*) as residents, avg(age) as AverageAge
from people
group by city

同样,我想要一个城市的最大年龄的居民的名字

select city, name, max(age) as AverageAge
from people
group by city

但是这个查询不能工作,因为name不在Group By子句中,也没有用作聚合函数

你能帮帮我吗

不是最干净的方法,但是你可以这样做:

SELECT P1.*
FROM People P1
JOIN
(
  SELECT City, MAX(Age) AS Age
  FROM People
  GROUP BY City
) P2 ON P1.Age = P2.Age AND P1.City = P2.City

UPDATE:当考虑到执行计划时,我能想到的最高效的查询似乎是下面这个;它似乎也给出了最有意义的结果,如果有多个相同(最高)年龄的人,他们都将被选中;

SELECT P1.* 
FROM people p1
LEFT JOIN people p2
  ON p1.city=p2.city AND p1.age < p2.age
WHERE p2.age IS NULL

基本上,它将使用一个简单的左连接来获取所有在同一城镇中没有长辈的人。

否则,最简单的"一般"解决方案是使用一个简单的子查询来查找该镇任何人的最大年龄,并列出该年龄的城市中的人。如果几个人的年龄相同(最高),它将返回其中一个随机的;

SELECT city, name, age
FROM people
WHERE age = (SELECT MAX(age) FROM people p WHERE p.city=people.city)
GROUP BY city;

我在这里将第一个查询添加到Aaron的SQLfiddle中,正如您可以看到的,本文中的第一个查询是三个查询中唯一一个没有临时或文件格式的查询。

Try

select city, name, max(age) as AverageAge
from people
group by city, name

sql group by query要求在select

中出现的所有列名

您需要子查询,这是一种非常有用的技术,适用于各种解决方案。当需要时,它们是唯一有效的解决方案。当我忘记了我需要的确切语法时,我总是去这个页面http://allenbrowne.com/subquery-01.html(值得收藏,因为它不是谷歌上的第1页,因为它已经在过去了)你想要"TOP n每组记录"部分。希望对大家有所帮助

"最大年龄"的定义:(在同一城市)没有比这个年龄更大的人

SELECT pp.*
FROM people pp
WHERE NOT EXISTS (
  SELECT *
  FROM people px
  WHERE px.city = pp.city
  AND px.age > pp.age
  )
  ;

我认为这是最简单的方法:

SELECT P.city, P.name, P.age as AverageAge
FROM people P
WHERE P.age = (SELECT MAX(age)
               FROM people.P2));

相关内容

最新更新