2016-03-23 94 views
0

考慮這個玩具的例子,我有一個非常簡單的SQL表,包含一些partnumbers,價格和貨幣。我想找到每件商品的最低價格。如何根據標準過濾行

她的是表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(在關係情況下)選擇多於記錄,而第二種方法總是選擇每個partnumber一個記錄。

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; 

如果有最低價格的關係,這種選擇的任意一個。對於所有這些,請使用rank()dense_rank()而不是row_number()