Ich möchte eine Abfrage wie folgt schreiben:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
Aber so funktioniert die MAX
Funktion doch nicht , oder? Da es sich um eine Aggregatfunktion handelt, erwartet sie einen einzelnen Parameter und gibt dann die MAX aller Zeilen zurück.
Weiß jemand, wie es auf meine Weise geht?
sql
sql-server
max
skb
quelle
quelle
GREATEST
Funktion implementiert . SQLite emuliert die Unterstützung, indem mehrere Spalten imMAX
Aggregat zugelassen werden.Antworten:
Sie müssten eine erstellen,
User-Defined Function
wenn Sie eine Syntax ähnlich Ihrem Beispiel haben möchten, aber könnten Sie das, was Sie tun möchten, inline ziemlich einfach mit einerCASE
Anweisung tun , wie die anderen gesagt haben.Das
UDF
könnte so etwas sein:... und du würdest es so nennen ...
quelle
Wenn Sie SQL Server 2008 (oder höher) verwenden, ist dies die bessere Lösung:
Alle Gutschriften und Stimmen sollten an Svens Antwort auf eine verwandte Frage gehen: "SQL MAX aus mehreren Spalten?"
Ich sage, es ist die " beste Antwort ", weil:
SELECT MAX (a), MAX (b) FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) AS MyTable (a, b)
quelle
Kann in einer Zeile erfolgen:
Bearbeiten: Wenn Sie mit sehr großen Zahlen arbeiten, müssen Sie die Wertvariablen in bigint konvertieren, um einen ganzzahligen Überlauf zu vermeiden.
quelle
Das glaube ich nicht. Ich wollte das neulich. Das nächste, was ich bekam, war:
quelle
Probieren Sie die IIF- Funktion aus (erfordert SQL Server 2012 und höher).
Das ist es.
(Hinweis: Seien Sie vorsichtig mit beiden
null
, da das Ergebnis vona>b
immer dann falsch ist, wenn eines von beiden null ist.b
In diesem Fall ist dies auch das Ergebnis.)quelle
NULL
, ist das Ergebnis immer der zweite.NULL > 1234
Aussage falsch istIIF(a>b, a, COALESCE(b,a))
den Wert zu geben , wenn nur eine vorhandenquelle
Die anderen Antworten sind gut, aber wenn Sie sich Sorgen um NULL-Werte machen müssen, möchten Sie möglicherweise diese Variante:
quelle
In SQL Server 2012 oder höher können Sie eine Kombination aus
IIF
undISNULL
(oderCOALESCE
) verwenden, um maximal 2 Werte abzurufen.Auch wenn einer von ihnen NULL ist.
Oder wenn Sie möchten, dass 0 zurückgegeben wird, wenn beide NULL sind
Beispielausschnitt:
Ergebnis:
Aber wenn man mehrere Werte summieren muss?
Dann schlage ich vor, CROSS APPLY auf eine Aggregation der VALUES anzuwenden.
Dies hat auch den Vorteil, dass dadurch gleichzeitig andere Dinge berechnet werden können.
Beispiel:
quelle
Unterabfragen können über die äußere Abfrage auf die Spalten zugreifen, sodass Sie diesen Ansatz verwenden können , um Aggregate zu verwenden, z. B.
MAX
spaltenübergreifend. (Wahrscheinlich nützlicher, wenn eine größere Anzahl von Spalten beteiligt ist)quelle
VALUES
Syntax ist schöner.SQL Server 2012 eingeführt
IIF
:Die Verwendung von NULL-Werten wird bei der Verwendung empfohlen
IIF
, da aNULL
auf beiden Seiten von Ihnen dazuboolean_expression
führt, dassIIF
diefalse_value
(im Gegensatz zuNULL
) zurückgegeben wird.quelle
Ich würde mich für die von kcrumley bereitgestellte Lösung entscheiden. Ändern Sie sie einfach geringfügig, um NULL-Werte zu verarbeiten
BEARBEITEN Geändert nach Kommentar von Mark . Wie er in der 3-wertigen Logik richtig ausgeführt hat, sollte x> NULL oder x <NULL immer NULL zurückgeben. Mit anderen Worten unbekanntes Ergebnis.
quelle
So einfach ist das:
quelle
quelle
Hoppla, ich habe gerade einen Betrüger dieser Frage gepostet ...
Die Antwort lautet: Es gibt keine integrierte Funktion wie die von Oracle Greatest , aber Sie können mit einer UDF ein ähnliches Ergebnis für zwei Spalten erzielen. Beachten Sie, dass die Verwendung von sql_variant hier sehr wichtig ist.
kristof
Gepostet diese Antwort:
quelle
Hier ist ein Fallbeispiel, das Nullen verarbeiten sollte und mit älteren Versionen von MSSQL funktioniert. Dies basiert auf der Inline-Funktion in einem der beliebtesten Beispiele:
quelle
Ich würde es wahrscheinlich nicht so machen, da es weniger effizient ist als die bereits erwähnten CASE-Konstrukte - es sei denn, Sie hätten vielleicht Indizes für beide Abfragen abgedeckt. In beiden Fällen ist es eine nützliche Technik für ähnliche Probleme:
quelle
Für die obige Antwort bezüglich großer Zahlen können Sie die Multiplikation vor der Addition / Subtraktion durchführen. Es ist etwas sperriger, erfordert aber keine Besetzung. (Ich kann nicht für Geschwindigkeit sprechen, aber ich gehe davon aus, dass es immer noch ziemlich schnell ist)
Änderungen an
Zumindest eine Alternative, wenn Sie das Casting vermeiden möchten.
quelle
Hier ist eine IIF-Version mit NULL-Behandlung (basierend auf Xins Antwort):
Die Logik lautet wie folgt: Wenn einer der Werte NULL ist, geben Sie den Wert zurück, der nicht NULL ist (wenn beide NULL sind, wird ein NULL zurückgegeben). Andernfalls geben Sie den größeren zurück.
Gleiches gilt für MIN.
quelle
Sie können so etwas tun:
quelle
quelle
quelle
In seiner einfachsten Form ...
quelle
Für SQL Server 2012:
quelle
Hier ist die Antwort von @Scott Langham mit einfacher NULL-Behandlung:
quelle
quelle
quelle
VALUES
Inline so interessant ist , bin ich mir nicht sicher, ob dies einfacher ist alsCASE
oderIFF
. Es würde mich interessieren, wie sich die Leistung dieser Lösung im Vergleich zu den anderen Optionen verhältWenn Sie die Antwort von Xin erweitern und davon ausgehen, dass der Vergleichswerttyp INT ist, funktioniert dieser Ansatz auch:
Dies ist ein vollständiger Test mit Beispielwerten:
quelle
Gehen Sie in MemSQL wie folgt vor:
quelle
In Presto können Sie verwenden
quelle