Das fühlt sich so an, als ob es einfach sein sollte. Wie erhalte ich die neuesten Daten in verschiedenen Spalten?
DROP TABLE #indebtedness
CREATE TABLE #indebtedness (call_case CHAR(10), date1 DATETIME, date2 DATETIME, date3 DATETIME)
INSERT #indebtedness VALUES ('Key1', '2019-10-30', '2019-11-30', '2019-10-25')
INSERT #indebtedness VALUES ('Key2', '2019-10-20', '2019-10-30', '2019-10-15')
INSERT #indebtedness VALUES ('Key3', '2019-11-11', '2019-10-29', '2019-10-30')
INSERT #indebtedness VALUES ('Key4', null , '2019-10-29', '2019-10-13')
select call_case, ?? AS 'Latest Date' from #indebtedness
Ich möchte, dass das Ergebnis lautet:
call_case Latest Date
Key1 2019-11-30
Key2 2019-10-30
Key3 2019-11-11
Key4 2019-10-29
sql
sql-server
datetime
Ahmed Alkhteeb
quelle
quelle
NULL
.MAX
Verwendung übernehmenGROUP BY
. Meine Antwort auf Ihre Frage lautet also "wird nicht behoben", da ich denke, dass sich Ihr Datenbankdesign möglicherweise ändern muss.call_case
) und einem Zeitstempel haben. Keine einzige Tabelle mit 50 SpaltenDie derzeit akzeptierte Antwort ist die beste Antwort, aber ich denke nicht, dass sie gut genug ist, um zu erklären, warum. Die anderen Antworten sehen auf den ersten Blick sicherlich viel sauberer aus (wer möchte diese hässliche Fallerklärung schreiben), sind aber wahrscheinlich viel schlechter, wenn Sie anfangen, in großem Maßstab zu arbeiten.
So richte ich alles ein
Auf meinem System werden dadurch 12.872.738 Zeilen in der Tabelle angezeigt. Wenn ich jede der oben genannten Abfragen versuche (angepasst,
SELECT INTO
damit ich nicht warten muss, bis der Druck der Ergebnisse in SSMS abgeschlossen ist), erhalte ich die folgenden Ergebnisse:Wenn Sie sich die Abfragepläne ansehen, wird es ziemlich offensichtlich, warum - wenn Sie irgendeine Art von Unpivot oder Aggregat hinzufügen (oder der Himmel verbietet
STRING_SPLIT
), erhalten Sie alle möglichen zusätzlichen Operatoren, die Sie nicht benötigen (und das zwingt den Plan dazu Gehen Sie parallel und nehmen Sie Ressourcen weg, die andere Abfragen möglicherweise benötigen. Laut VertragCASE
läuft die basierte Lösung nicht parallel, läuft sehr schnell und ist unglaublich einfach.In diesem Fall sollten Sie den einfachsten und schnellsten Ansatz wählen, es sei denn, Sie verfügen über unbegrenzte Ressourcen (Sie haben keine).
Es stellte sich die Frage, was zu tun ist, wenn Sie ständig neue Spalten hinzufügen und die case-Anweisung erweitern müssen. Ja, das wird unhandlich, aber jede andere Lösung auch. Wenn dies tatsächlich ein plausibler Workflow ist, sollten Sie Ihre Tabelle neu gestalten. Was Sie wollen, sieht wahrscheinlich ungefähr so aus:
Dies ist sicherlich nicht frei von potenziellen Leistungsproblemen und erfordert eine sorgfältige Indexoptimierung, ist jedoch der beste Weg, um mit einer beliebigen Anzahl potenzieller Zeitstempel umzugehen
Falls irgendwelche Antworten gelöscht werden, hier sind die Versionen, die ich verglichen habe (in der Reihenfolge)
quelle
Versuche dies:
quelle
NULL
s, sollte eine gute Leistung haben und lässt sich leicht auf mehr Spalten verallgemeinern.SQL FIDDLE
Verwenden
MAX()
Verwenden
CASE
quelle
VALUES
weitaus skalierbarer als ein großerCASE
Ausdruck. Ich würde auch gerne erfahren, warum es abgelehnt wurde, da der Wähler zu glauben scheint , dass es ein Problem mit dem SQL gibt, und wenn sie uns dieses Problem mitteilen, können wir alle daraus lernen.Aus meiner Sicht ist Pivot die beste und effizienteste Option für diese Abfrage. Kopieren und Einfügen in den MS SQL Server. Bitte überprüfen Sie den unten angegebenen Code:
quelle
Dies sollte wirklich auf der Designebene neu bewertet werden, wie andere angegeben haben. Im Folgenden finden Sie ein Beispiel für ein anderes Design, bei dem zwei Tabellen verwendet werden, um das zu erreichen, wonach Sie in Ihren Ergebnissen suchen. Dies wird das Wachstum viel günstiger machen.
Hier ist ein Beispiel (verschiedene Tabellennamen verwendet):
Dies ermöglicht das Hinzufügen weiterer Falltypen, das Hinzufügen von viel mehr Protokolleinträgen und ein besseres Design.
Dies ist nur ein Beispiel für Lernzwecke.
quelle