Ich habe eine Datentabelle (die Datenbank ist MSSQL):
ID OrderNO PartCode Quantity DateEntered
417 2144 44917 100 18-08-11
418 7235 11762 5 18-08-11
419 9999 60657 100 18-08-11
420 9999 60657 90 19-08-11
Ich möchte eine Abfrage durchführen, die OrderNO, PartCode und Quantity zurückgibt, jedoch nur für die zuletzt registrierte Bestellung.
Aus der Beispieltabelle möchte ich folgende Informationen zurückerhalten:
OrderNO PartCode Quantity
2144 44917 100
7235 11762 5
9999 60657 90
Beachten Sie, dass für die Bestellung 9999 nur eine Zeile zurückgegeben wurde.
Vielen Dank!
sql-server
GEMI
quelle
quelle
MAX(DATE)
eine Zeile für Bestellung 9999 zurück?Antworten:
Wenn
rownumber() over(...)
für Sie verfügbar ist ....quelle
Der beste Weg ist Mikael Eriksson, falls
ROW_NUMBER()
er Ihnen zur Verfügung steht.Das nächstbeste ist die Teilnahme an einer Abfrage gemäß der Antwort von Cularis.
Alternativ ist der einfachste und direkteste Weg eine korrelierte Unterabfrage in der WHERE-Klausel.
Oder...
quelle
Dies ist die schnellste aller oben angegebenen Abfragen. Die Abfragekosten betrugen 0,0070668.
Die oben bevorzugte Antwort von Mikael Eriksson hat Abfragekosten von 0,0146625
Die Leistung eines so kleinen Beispiels interessiert Sie vielleicht nicht, aber bei großen Abfragen summiert sich alles.
quelle
Die innere Abfrage wählt alle
OrderNo
mit ihrem maximalen Datum aus. Um die anderen Spalten der Tabelle abzurufen, können Sie sieOrderNo
und die verbindenMaxDate
.quelle
Für MySql können Sie Folgendes tun:
quelle
{ }
) auf der Editor - Symbolleiste zu schön Format und die Syntax markieren Sie es!Und Sie können diese select-Anweisung auch als Abfrage für die linke Verknüpfung verwenden ... Beispiel:
Hoffe das hilft jemandem, der danach sucht :)
quelle
rownumber () over (...) funktioniert, aber diese Lösung hat mir aus zwei Gründen nicht gefallen. - Diese Funktion ist nicht verfügbar, wenn Sie eine ältere SQL-Version wie SQL2000 verwenden. - Funktionsabhängigkeit und nicht wirklich lesbar.
Eine andere Lösung ist:
quelle
Wenn Sie ID und OrderNo indiziert haben, können Sie IN: (Ich hasse es, Einfachheit gegen Dunkelheit zu tauschen, nur um einige Zyklen zu sparen):
quelle
Vermeiden Sie IN use JOIN
quelle
Das hat bei mir ganz gut geklappt.
quelle
Das funktioniert bei mir. Verwenden Sie MAX (CONVERT (Datum, ReportDate)) , um sicherzustellen, dass Sie einen Datumswert haben
quelle