2016-10-12 6 views
1

Gibt es jede bessere Lösung diese mehr zu bekommen (manchmal wäre es manchmal nur eine Zeile, sein - mehrere) Zeilen mit dem minimalen Wert amount ohne subquery? Wenn es keine besseren Lösungen gibt, ist das in Ordnung, nur ein bisschen traurig. :)Besser SELECT WHERE MAX

My Table

Meine erste Lösung ist so (Ich mag subquery nicht)

SELECT * FROM transactions 
WHERE wallet_id = 148 
    AND amount = (SELECT MIN(amount) FROM transactions WHERE wallet_id = 148) 

Result

+3

Die gute Nachricht ist, dass es eine bessere Lösung gibt. Lesen Sie [diese Antwort] (http://stackoverflow.com/a/28090544/4265352) für Details. Die schlechte Nachricht ist, dass ich nicht in der Stimmung bin, die dort veröffentlichte Technik anzuwenden, um die Anfrage für Ihren Fall zu generieren. Du wirst es selbst machen müssen :-) – axiac

+0

Ich werde später noch mehr testen, ich habe nur Zugriff auf eine Sybase hier und es scheint hier nicht akzeptiert zu werden ... – AxelH

Antwort

2

Allgemeine Abfrage jede Brieftasche mit seiner minimalen Menge zu finden:

SELECT t1.* 
FROM transactions t1 
JOIN (SELECT wallet_id, MIN(amount) minamount 
     FROM transactions GROUP BY wallet_id) t2 
    on t1.wallet_id = t2.wallet_id and t1.amount = t2.minamount 

WHERE t1.wallet_id = 148 -- keep or remove this line 
+0

Das scheint ordentlich, du bist da noch eine Unterabfrage :) – Rozkalns

+0

Es ist "es". Sag einfach ';-) – Strawberry

+0

@Strawberry, danke. Ich tendiere dazu, diesen Fehler immer wieder zu machen ... – jarlh

0

Manchmal auch als "LEFT Exclusive JOI N "(und hier ist es auch ein" Self-Join ", wie wir die Tabelle verwenden, um sich selbst zu verbinden). Die Bedingungen des Joins erfordern, dass t1.mount größer ist als t2.amount und dann suchen wir durch die where-Klausel die Zeilen, die keine Übereinstimmung haben, daher haben wir den niedrigsten Wert von t1.mount.

SELECT 
     t1.* 
FROM transactions t1 
LEFT JOIN transactions t2 ON t1.wallet_id = t2.wallet_id AND t1.amount > t2.amount 
WHERE t1.wallet_id = 148 AND t2.wallet_id IS NULL 

siehe: http://data.stackexchange.com/stackoverflow/query/556758/left-excluding-self-join

siehe auch Diagramm Left excluding JOIN

nb: Ich dies besser sein nicht behaupten, oder "richtig"; nur dass es eine Alternative ist