2016-03-23 18 views
0

私は非常に単純なSQLテーブルに部品番号、価格、通貨を含むこのおもちゃの例を考えてみましょう。私は各項目の最低価格を探したい。条件に基づいて行をフィルタリングする方法

ハーズはテーブルPRICELIST

PartNumber  Price    Currency 
1    19     USD 
1    10     CAD 
1    18     GBP 
2    15     USD 
2    14     CAD 
2    8     GBP 
3    5     USD 
3    1     CAD 
3    11     GBP 

である私は、通貨での最低価格を表示したいです。これは私が欲しい出力されます:

PartNumber  Price    Currency 
1    10     CAD 
2    8     GBP 
3    1     CAD 

私はselect partnumber, min(price) from pricelist group by partnumber

を言うならば、クエリが実行されますが、私は通貨を指定した場合:

select partnumber, min(price),currency from pricelist group by partnumber

それから私はというエラーが出ます:

SELECT句、HAVING句、またはORDER BY句に "CURRENCY"が指定されている式は、 e GROUP BY句が指定されているか、列函数付きのSELECT句、HAVING句、またはORDER BY句にあり、GROUP BY句が指定されていません。

最低の行の通貨値を表示する価格。私は何をすべきか?

データベースはDB2です。ところで

が、これはつまり、あなたは残りの部分を取得するために、元のテーブルに戻って参加する必要があり

答えて

1

を重要ならば、私の実際のクエリでは、私は、大きなセットを作成するために参加する残っている、非常に簡略化した例であります

select t1.partnumber, t1.price, t1.Currency 
from pricelist as t1 
join (
    select partnumber, min(price) as price 
    from pricelist 
    group by partnumber 
) as t2 on t1.partnumber = t2.partnumber and t1.price = t2.price 

代わりにあなたがROW_NUMBER使用することができます:

select partnumber, price, Currency 
from (
    select partnumber, price, Currency, 
     row_number() over (partition by partnumber 
          order by price) as rn 
    from pricelist) as t 
where t.rn = 1 

注:最初のフィールドのメソッドは、partnumber(結びつきの場合)ごとに複数のレコードを選択できますが、2番目の方法では常にpartnumberごとに1レコードが選択されます。

1

だけrow_number()を使用します。

select pl.* 
from (select pl.*, 
      row_number() over (partition by partnumber order by price) as seqnum 
     from pricelist 
    ) pl 
where seqnum = 1; 

最低価格結びつきがある場合、これは任意のものを選択します。すべての場合、row_number()の代わりにrank()またはdense_rank()を使用してください。

関連する問題