2

私は何かを理解するためにある種の問題を抱えています。

次のテーブルがあります。

ID  PROD    PRICE
1   A        10
2   B        20
3   C        30
4   A        1
5   B        12
6   C        2
7   A        7
8   B        8
9   C        9
10  A        5
11  B        2

すべての製品のすべての最低価格を取得したい、つまり、すべての製品の最低価格である 3 つのレコードを取得したいということです。上記の例から、これは私が取得したいものです:

ID  PROD    MIN(PRICE)
4   A       1
11  B       2
6   C       2

これは私が書いたクエリです:

select id, prod, min(price)
from A1
group by(prod);

しかし、これは私が得た記録です:

ID  PROD    MIN(PRICE)
1   A        1
2   B        2
3   C        2

ID 値が間違っていることがわかりますが、実際の ID 値ではなく、ある種のライン カウンターが表示されるだけです。

次のリンクで確認できます

私が間違っていることは何ですか?

4

2 に答える 2

8
SELECT  a.*
FROM    A1 a
        INNER JOIN
        (
            SELECT Prod, MIN(Price) minPrice
            FROM A1
            GROUP BY Prod
        ) b ON a.Prod = b.Prod AND
                a.Price = b.minPrice

為にMSSQL

SELECT ID, Prod, Price
FROM
(
  SELECT ID, Prod, Price,
        ROW_NUMBER() OVER(Partition BY Prod ORDER BY Price ASC) s
  FROM A1
) a
WHERE s = 1
于 2012-11-11T18:01:25.337 に答える
2

MySQL またはおそらく PostgreSQL を使用している必要があります。

標準 SQL では、選択リスト内のすべての非集計列を GROUP BY 句で引用する必要があります。

ID列が必要かどうかはわかりません。そうでない場合は、次を使用します。

SELECT prod, MIN(price) AS min_price
  FROM A1
 GROUP BY prod;

一致する ID 番号が必要な場合は、それがサブクエリになります。

SELECT id, prod, price
  FROM A1
  JOIN (SELECT prod, MIN(price) AS min_price
          FROM A1
         GROUP BY prod
       ) AS A2 ON A1.prod = A2.prod AND A1.price = A2.min_price;

私が書いたものの何が問題なのか説明していただけますか。はい、ID 列が必要です。

select id, prod, min(price)
from A1
group by(prod);

標準 SQL では、エラー メッセージが表示されます (または、標準でない場合は、ほとんどの SQL DBMS で)。

prodGROUP BY 句から ID 列を省略できる場合は、正しい値と値の ID の準ランダム値を取得しMIN(price)ます。基本的に、オプティマイザーは気まぐれに基づいて、知っている便利な ID を選択します。具体的には、完全な回答が行うサブクエリと結合を行いません。たとえば、シーケンシャル スキャンを実行し、返される ID は、指定された値に対して最初または最後に検出されたprodものである場合もあれば、他の値である場合もあります。返された ID がprod = 'A'に関連付けられた ID である必要がありprod = 'A'ます。マニュアルをよく読む必要があります。基本的に、クエリは不確定であるため、多くの戻り値は許容され、「正しい」ものです (ただし、必要なものではありません)。

ではなく ID でグループ化した場合prod、 の結果はprod確定的であることに注意してください。これは、ID 列がテーブルの候補キー (一意の識別子) であるためです。(PostgreSQL は 2 つのケースを区別していると思いますが、それについては確信が持てません。MySQL はそうではありません。)

于 2012-11-11T18:04:18.460 に答える