0

ここで、次のクエリは、都市の平均年齢と居住者数の結果を返します。Group BY は City に適用され、居住者の Count および Age は AVG として Aggregated 関数に適用されます。

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

基本的に、単純な左結合を使用して、同じ町に年配の人がいないすべての人を取得します。

それ以外の場合、最も読みやすい「一般的な」解決策は、単純なサブクエリを使用して、町の人の最大年齢を見つけ、その年齢の都市の人々をリストすることです。複数の人が同じ (最も高い) 年齢である場合、代わりにランダムな 1 人を返します。

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に最初のクエリを追加しました。この投稿の最初のクエリは、3 つのうち一時的またはファイルソートのない唯一のクエリであることがわかります。

于 2013-01-01T11:51:48.093 に答える
0

試す

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

sql group by queryには、selectに存在するすべての列名が必要です

于 2013-01-01T11:45:38.690 に答える
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 に答える
0

サブクエリが必要です。これは、幅広いソリューションに適した非常に便利な手法です。それらが必要な場合、それらは唯一の効果的なソリューションです。必要な正確なシナタックスを忘れたときは、常にこのページhttp://allenbrowne.com/subquery-01.htmlにアクセスします(過去にあったサブクエリのGoogleのページ1ではないため、ブックマークする価値があります)。 「グループごとのTOP 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 に答える