0

下面的查询将给出一个城市的平均年龄和居民人数的结果。Group BY 应用于城市和居民的聚合函数作为计数和年龄作为 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

但是此查询不起作用,因为Group By 子句中没有名称,也没有用作聚合函数

你能帮我解决这个问题吗?

4

6 回答 6

3

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

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
于 2013-01-01T11:57:43.627 回答
1

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

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中,您可以看到这篇文章中的第一个查询是三个查询中唯一一个没有临时或文件排序的查询。

于 2013-01-01T11:51:48.093 回答
0

尝试

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

sql group by 查询需要选择中存在的所有列名

于 2013-01-01T11:45:38.690 回答
0

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

于 2013-01-01T12:00:28.817 回答
0

“最大年龄”的定义:没有个人(在同一个城市)的年龄更高

SELECT pp.*
FROM people pp
WHERE NOT EXISTS (
  SELECT *
  FROM people px
  WHERE px.city = pp.city
  AND px.age > pp.age
  )
  ;
于 2013-01-01T12:36:06.317 回答
0

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

SELECT P.city, P.name, P.age as AverageAge
FROM people P
WHERE P.age = (SELECT MAX(age)
               FROM people.P2));
于 2016-10-21T17:09:13.933 回答