2

私はテーブル、テーブル1を持っています。このテーブルには名前、都市、価格があります。名前はすべて一意であり、都市は再利用できます。各都市の最高価格と、その行に関連付けられている名前を取得するクエリを作成したいと思います。各都市の最高価格を取得するには、次のようにします。

SELECT MAX(price), city FROM table1 GROUP BY city

でも名前も欲しいです。やってみたら

SELECT MAX(price), city, name FROM table1 GROUP BY city

次に、nameがgroupbyに含まれていない方法に関するクエリエラーが発生します。グループに名前を追加すると、希望どおりの結果が得られません。2つのクエリを使用してこれを行う方法を考えることができますが、1つだけでそれを行う方法があるに違いありません。私は何が欠けていますか?

私はstackoverflowについていくつかの同様の質問を見つけましたが、それらはすべて私が試みているよりも複雑なことをしているようです。私はこれまで単純なSQLクエリしか使用していなかったので、より高度な機能のいくつかについて自分自身を教育しています。

4

4 に答える 4

4
WITH RankedPrices AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY city ORDER BY price DESC) AS ix
    FROM table1
)
SELECT * FROM RankedPrices WHERE ix=1;

ある都市の2つの製品が最も高価で、価格が同じである場合にどうなるかを指定しなかったことに注意してください。ここでのこのクエリは、2つのうちのいずれか(ただし1つのみ)を返します。これを別の方法で処理することもできます。

于 2012-04-09T10:41:23.287 に答える
1
SELECT
  name, city, price
FROM
  table1 t
WHERE
  price = (SELECT MAX(price) FROM table 1 WHERE city = t.city)

インデックスオーバー(city, price)とワンオーバー(price)は、行が多い場合にこのクエリのパフォーマンスを向上させます。

于 2012-04-09T10:35:28.497 に答える
1
SELECT name, city, price
FROM table1 t
WHERE price = (SELECT MAX(price) FROM table1 WHERE city = t.city)
于 2012-04-09T10:36:25.207 に答える
1

完全を期すために、を使用したサンプルをGROUP BY次に示しますが、都市ごとの重複する最大価格の処理に関して、TomalakとLoganによる他のソリューションと同じ警告があります。

SELECT t2.city, t2.name, t2.price
    FROM (SELECT city, MAX(price) AS price FROM table1 GROUP BY city) AS t
    JOIN table1 AS t2 ON t.city = t2.city AND t.price = t2.price

ランキングアプローチの方が明確で柔軟性が高いので、私はランキングアプローチを好みます。

于 2012-04-09T11:08:58.973 に答える