2017-03-07 2 views
0

Ich brauche Hilfe mit Teradata SQL und ich hoffe, Sie können helfen. Ich habe eine Tabelle, die wie folgt aussieht:Ein Kunde aus der Tabelle

email | article number | discount | price 
[email protected] | 123 | 15 | 999 
[email protected] | 456 | 30 | 1999 
[email protected] | 789 | 30 | 999 

Aus dieser Tabelle ich nur vom Kunden rudern will, die den höchsten Rabatt hat und der niedrigste Preis (wenn es mehrere Zeilen mit dem gleichen Rabatt sind).

Also im obigen Beispiel möchte ich nur die 3. Zeile. Wie kann ich eine SQL-Abfrage dafür schreiben?

Antwort

0

Verwenden Sie NOT EXISTS, um eine Zeile nur zurückzugeben, wenn es keine andere Zeile mit einem höheren Rabatt oder eine andere Zeile mit demselben Rabatt und einem niedrigeren Preis gibt.

select * 
from tablename t1 
where not exists (select 1 from tablename t2 
        where t2.discount > t1.discount 
        or (t2.discount = t1.discount and t2.price < t1.price)) 
1

Der einfachste Weg, dies zu tun ist über eine einfache select-Anweisung von Rabatt bestellt (absteigend) und dann nach Preis (aufsteigend).

SELECT * FROM customers 
ORDER BY discount DESC, price ASC 
LIMIT 1 
2

Die flexibelste Art und Weise nutzt ROW_NUMBER:

select * from myTable 
QUALIFY 
    ROW_NUMBER() 
    OVER (PARTITION BY email -- for each customer, otherwise remove it 
     ORDER BY discount DESC, price ASC) = 1 
Verwandte Themen