2016-03-23 14 views
0

Betrachten Sie dieses Spielzeugbeispiel, in dem ich eine sehr einfache SQL-Tabelle mit einigen Artikelnummern, Preisen und Währungen habe. Ich möchte den niedrigsten Preis für jeden Artikel finden.So filtern Sie Zeilen anhand von Kriterien

Hers ist Tabelle 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 

ich den niedrigsten Preis mit der Währung angezeigt werden soll. Dies ist der Ausgang Ich möchte:

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

wenn ich sage, select partnumber, min(price) from pricelist group by partnumber

die Abfrage ausführen, aber wenn ich die Währung angeben:

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

Dann bekomme ich eine Fehlermeldung,:

Ein Ausdruck, der mit "CURRENCY" beginnt, der in einer SELECT-Klausel, HAVING-Klausel oder ORDER BY-Klausel angegeben ist, ist in th nicht angegeben Die GROUP BY-Klausel oder eine SELECT-Klausel, HAVING-Klausel oder ORDER BY-Klausel mit einer Spaltenfunktion und keine GROUP BY-Klausel wird angegeben.

Ich möchte den Währungswert für die Zeile anzeigen, die die niedrigste hat Preis. Was soll ich machen?

Datenbank ist DB2.

By the way, ist dies ein sehr vereinfachtes Beispiel, in meine eigentliche Abfrage habe ich links schließt sich größere Mengen zu erzeugen, wenn das

Antwort

1

Sie müssen kommen zurück auf die ursprüngliche Tabelle zählt, um den Rest zu erhalten der Felder:

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 

Hinweis: der erste

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 

Alternativ können Sie ROW_NUMBER verwenden Methode kann mehr auswählen als partnumber (bei Bindungen), während die zweite Methode immer einen Datensatz pro partnumber auswählt.

1

Nur row_number() verwenden:

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

Wenn es Verbindungen zum niedrigsten Preis sind, diese wählt willkürlich. Verwenden Sie für alle von ihnen rank() oder dense_rank() anstelle von row_number().

Verwandte Themen