2013-01-01 45 views
0
年齡上限

在這裏,下面的查詢將給出平均年齡在一個城市的居民數量的結果。 Group BY將城市和居民的聚合功能應用爲Count和Age作爲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

嘗試通過查詢

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

SQL組要求所有存在於選擇

1

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; 

我加入了第一個查詢亞倫SQLfiddle here,你可以看到在這個職位的第一個查詢是三個沒有臨時或文件排序的唯一一個。

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 
+0

看起來完全乾淨給我;我就是這麼做的。使用OLAP函數可能會有不同的做法,但它們對於這種情況並不重要。請注意,如果Whoville中有三個人都是102歲,那麼Whoville將生成三行;這不是查詢中的缺陷,而是正確的答案。如果有一個在同一天出生的雙胞胎之間進行選擇的標準,那麼需要在查詢規範中記錄這些標準。有人可能會問爲什麼數據庫記錄年齡而不是出生日期;年齡不斷變化,但出生日期不會。 –

+0

約阿希姆的解決方案看起來稍微快一些,儘管我認爲它是可以忽略的(請參閱此編輯版本的SQL小提琴的執行計劃) - http://sqlfiddle.com/#!2/57b18/2 –

+0

@AaronNewton好點在查詢計劃中,我很慚愧地說我甚至沒有看過他們。向我的帖子添加了更好的查詢。 –

0

你需要一個子查詢,它是一個非常有用的技術sutable了廣泛的解決方案。當他們需要時,他們是唯一有效的解決方案。我總是去http://allenbrowne.com/subquery-01.html這個頁面時,我已經忘了(對谷歌的價值作爲書籤的頁面不是1,對於子查詢,它已經在過去的)確切synatax我需要你想要的「TOP N每組記錄」一節。希望這可以幫助的「最大年齡」

0

定義:具有較高的年齡

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

這裏是做在我看來,最簡單的方法是沒有個人(在同一城市):

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