1

私は次のようなテーブルを持っています:

id(int)    flag(int)    price(float)

1          0            50
2                       400
3          4            200
4          3            150
5          3            100
6          3            400
7          2            120

Soのすべてのグループでflag最も低い行を選択して、個別の行をすべて選択したい ので、この例では次のようになります。priceflag

id(int)    flag(int)    price(float)

1          0            50
2                       400
3          4            200
5          3            100
7          2            120

flagこれは必須ではないため、値(int)またはなし(null)を持つことができることに注意してください。

よろしく

編集:

明確にするためだけに。

価格でフィルタリングせずに、idとを含むすべての行を選択したいと思います。price次に、各グループの最低価格の行のみに参加したいと思います。flags

4

3 に答える 3

3
SELECT id, flag, price
FROM tbl t
WHERE NOT EXISTS (
  SELECT 1
  FROM tbl tt
  WHERE t.flag = tt.flag
    AND (tt.price < t.price 
         OR (tt.price = t.price AND t.id < tt.id)));

そして、これがそのためのsqlfiddleです。

于 2012-08-16T14:35:24.613 に答える
2

次のクエリは、各フラグの最低価格を見つけ、それらを元のデータに結合してID(および行の他の情報)を取得します。

select t.*
from table t join
     (select flag, min(price) as minprice
      from table t
      group by flag
     ) tsum
     on (tsum.flag = t.flag or tsum.flag is null as t.flag is null) and
        (tsum.minprice = t.price)
于 2012-08-16T14:37:33.643 に答える
0

Id列が必要だと思いますが、そうでない場合は、これを行う必要があります

SELECT flag, MIN(price) as price FROM Table GROUP BY flag

あなたがそれを必要とするならば、あなたはこれをしなければなりません

SELECT TBL1.*
FROM table TBL1
LEFT JOIN (SELECT flag, MIN(price) as price FROM table GROUP BY flag) TBL2
ON TBL1.flag = TBL2.flag AND TBL1.price = TBL2.price
WHERE TBL2.price IS NOT NULL

この最後のクエリは、グループ化の結果を使用し、元のテーブルと再度結合してから、最低価格が異なる行をフィルタリングします

于 2012-08-16T14:46:20.493 に答える