2016-03-23 57 views
0

Bazı oyuncak parçaları, fiyatlar ve para birimi içeren çok basit bir SQL tabloya sahip olduğum bu oyuncak örneğini düşünün. Her bir ürün için en düşük fiyatı bulmak istiyorum.Kriterlere göre satırlara filtre uygulama

Kızın tablo PRICELIST Ben para ile en düşük fiyatı göstermek istiyorum

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 

olduğunu. Ben select partnumber, min(price) from pricelist group by partnumber

sorgu çalıştırır söylersem

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

ama para belirtirseniz: Bu benim çıkış istiyorum edilir

Sonra

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

Şu hatayı alıyorum:

SELECT yan tümcesinde belirtilen "CURRENCY" ile başlayan bir ifade, HAVING yan tümce tümcesinde veya ORDER BY yan tümce GROUP BY yan tümce tümce veya bir SELECT yan tümcesinde, HAVING yan tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümce tümcesinde belirtildi.

En düşük satırın para birimi değerini görüntülemek istiyorum fiyat. Ne yapmalıyım?

veritabanı DB2'dir. Bu arada

, bu o gerisini alırsınız şekilde orijinal tabloya geri katılmak zorunda

cevap

1

konularda benim gerçek sorguda ben, daha büyük kümeleri oluşturmak için birleşir bırakmış, oldukça basit bir örnektir alanların:

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 

Alternatif ROW_NUMBER kullanabilirsiniz:

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 

Not: ilk yöntem, partnumber (bağlar söz konusu olduğunda) başına kayıttan daha fazlasını seçebilirken, ikinci yöntem her zaman partnumber için bir kayıt seçer.

1

Sadece row_number() kullanın: en düşük fiyat için bağlar varsa

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

, bu keyfi bir tane seçer. Hepsi için row_number() yerine rank() veya dense_rank() kullanın.