Wie gibt man 1 Wert pro Zeile des Maximums mehrerer Spalten zurück:
Tabellenname
[Number, Date1, Date2, Date3, Cost]
Ich muss so etwas zurückgeben:
[Number, Most_Recent_Date, Cost]
Abfrage?
sql
sql-server
tsql
BenB
quelle
quelle
WHEN Date1 > Date2 AND Date1 > Date3 THEN Date1; WHEN Date2 > Date3 THEN Date3; ELSE Date3
?Hier ist eine weitere schöne Lösung für die
Max
Funktionalität mit T-SQL und SQL Serverquelle
Wenn Sie MySQL verwenden, können Sie verwenden
quelle
Es gibt 3 weitere Methoden, bei denen
UNPIVOT
(1) bei weitem die schnellste ist, gefolgt von Simulated Unpivot (3), das viel langsamer als (1), aber immer noch schneller als (2) ist.Lösung 1 (
UNPIVOT
)Lösung 2 (Unterabfrage pro Zeile)
Lösung 3 (simuliert
UNPIVOT
)quelle
Eines der beiden folgenden Beispiele funktioniert:
Die zweite ist eine Ergänzung zu Lassevks Antwort.
quelle
Für T-SQL (MSSQL 2008+)
quelle
quelle
Skalarfunktionen verursachen alle Arten von Leistungsproblemen. Daher ist es besser, die Logik nach Möglichkeit in eine Inline-Tabellenwertfunktion zu packen. Dies ist die Funktion, mit der ich einige benutzerdefinierte Funktionen ersetzt habe, bei denen die Min / Max-Daten aus einer Liste von bis zu zehn Daten ausgewählt wurden. Beim Testen meines Datensatzes mit 1 Million Zeilen dauerte die Skalarfunktion mehr als 15 Minuten, bevor ich die Abfrage abbrach. Die Inline-TVF dauerte 1 Minute. Dies entspricht der Zeit, die für die Auswahl der Ergebnismenge in einer temporären Tabelle erforderlich ist. Um dies zu verwenden, rufen Sie die Funktion entweder über eine Unterabfrage in SELECT oder über eine CROSS APPLY auf.
quelle
Dies ist etwas einfacher zu schreiben und überspringt Bewertungsschritte, da die case-Anweisung der Reihe nach ausgewertet wird.
quelle
Leider hat Massees Antwort , obwohl sie offensichtlich erscheint, einen entscheidenden Fehler. Es kann keine NULL-Werte verarbeiten. Jeder einzelne NULL-Wert führt dazu, dass Date1 zurückgegeben wird. Leider wird jeder Versuch, dieses Problem zu beheben, extrem chaotisch und lässt sich nicht sehr gut auf 4 oder mehr Werte skalieren.
Die erste Antwort von databyss sah (und ist) gut aus. Es war jedoch nicht klar, ob die Antwort leicht auf 3 Werte aus einem Join mit mehreren Tabellen anstatt auf die einfacheren 3 Werte aus einer einzelnen Tabelle extrapoliert werden kann. Ich wollte vermeiden, eine solche Abfrage in eine Unterabfrage umzuwandeln, um maximal 3 Spalten zu erhalten. Außerdem war ich mir ziemlich sicher, dass die hervorragende Idee von databyss ein wenig aufgeräumt werden kann.
Also ohne weiteres, hier ist meine Lösung (abgeleitet von der Idee von databyss).
Es verwendet Cross-Joins, bei denen Konstanten ausgewählt werden, um den Effekt eines Multi-Table-Joins zu simulieren. Es ist wichtig zu beachten, dass alle erforderlichen Aliase korrekt ausgeführt werden (was nicht immer der Fall ist), wodurch das Muster durch zusätzliche Spalten recht einfach und ziemlich skalierbar bleibt.
quelle
Problem: Wählen Sie den Mindestpreis, der einem Unternehmen zugewiesen wird. Anforderungen: Die Agentursätze können null sein
Inspiriert von dieser Antwort von Nat
quelle
Wenn Sie SQL Server 2005 verwenden, können Sie die UNPIVOT-Funktion verwenden. Hier ist ein vollständiges Beispiel:
quelle
CROSS APPLY verwenden (für 2005+) ....
quelle
Ab SQL Server 2012 können wir IIF verwenden .
quelle
DECLARE @Date1 DATE='2014-08-01'; DECLARE @Date2 DATE=null; DECLARE @Date3 DATE='2014-07-05'; /*this gets returned*/
select IIF(@Date1 > @Date2 or @Date2 is null, IIF(@Date1 > @Date3 or @Date3 is null, @Date1, @Date3), IIF(@Date2 > @Date3 or @Date3 is null, @Date2, @Date3)) as MostRecentDate
Bitte versuchen Sie es mit
UNPIVOT
:quelle
Ich bevorzuge Lösungen, die auf dem Fall basieren, in dem ich davon ausgehe, dass sie den geringsten Einfluss auf den möglichen Leistungsabfall haben sollten, verglichen mit anderen möglichen Lösungen wie Cross-Apply, values (), benutzerdefinierten Funktionen usw.
Hier ist die Case-When-Version, die mit den meisten möglichen Testfällen Nullwerte verarbeitet:
und das Ergebnis ist:
quelle
Sie können eine Funktion erstellen, in der Sie die Daten übergeben und die Funktion dann wie unten beschrieben zur select-Anweisung hinzufügen. Wählen Sie Nummer, dbo.fxMost_Recent_Date (Datum1, Datum2, Datum3), Kosten
(@ Date1 smalldatetime, @ Date2 smalldatetime, @ Date3 smalldatetime) RETURNS smalldatetime AS BEGIN DECLARE @Result smalldatetime
ENDE
quelle
Basierend auf der ScottPletcher -Lösung von http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html habe ich eine Reihe von Funktionen (z. B. GetMaxOfDates3, GetMaxOfDates13) erstellt, um max von bis zu 13 Datumswerten mit UNION ALL. Siehe T-SQL-Funktion, um das Maximum an Werten aus derselben Zeile abzurufen. Zum Zeitpunkt des Schreibens dieser Funktionen habe ich jedoch noch keine UNPIVOT-Lösung in Betracht gezogen
quelle
Eine andere Möglichkeit, CASE WHEN zu verwenden
quelle
Die obige Tabelle enthält eine Gehaltsliste für Mitarbeiter mit Gehalt1, Gehalt2, Gehalt3, Gehalt4 als Spalten. Die folgende Abfrage gibt den Maximalwert aus vier Spalten zurück
Wenn Sie die obige Abfrage ausführen, wird die Ausgabe als größter Wert (10001) ausgegeben.
Die Logik der obigen Abfrage ist wie folgt:
Ausgabe wird 10001 sein
quelle
Hier ist eine gute Lösung:
quelle
Ich weiß nicht, ob es sich um SQL usw. handelt. In der M $ ACCESS-Hilfe gibt es eine Funktion namens
MAXA(Value1;Value2;...)
, die dies tun soll.Hoffnung kann jemandem helfen.
PD: Werte können Spalten oder berechnete Werte usw. sein.
quelle
MAXA
ist eine Excel-Funktion , kein Zugriff.