以下查询将给出平均年龄和城市居民人数的结果。 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子句中,也不用作聚合函数
你可以帮助我。
答案 0 :(得分: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
答案 1 :(得分: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 here添加了第一个查询,因为您可以看到此帖子中的第一个查询是三个中唯一没有临时或文件排序的查询。
答案 2 :(得分:0)
尝试
select city, name, max(age) as AverageAge
from people
group by city, name
sql group by query需要select
中的所有列名答案 3 :(得分:0)
您需要一个子查询,它是一种非常有用的技术,适用于各种解决方案。当需要它们时,它们是唯一有效的解决方案。当我忘记了我需要的确切synatax时,我总是转到此页面http://allenbrowne.com/subquery-01.html(值得加入书签,因为它不是google上的第1页,用于过去的子查询)你想要“每组最多n条记录” “ 部分。希望这有帮助
答案 4 :(得分:0)
“最大年龄”的定义:没有年龄较大的个体(在同一个城市)
SELECT pp.*
FROM people pp
WHERE NOT EXISTS (
SELECT *
FROM people px
WHERE px.city = pp.city
AND px.age > pp.age
)
;
答案 5 :(得分:0)
在我看来,这是最简单的方法:
SELECT P.city, P.name, P.age as AverageAge
FROM people P
WHERE P.age = (SELECT MAX(age)
FROM people.P2));