Ich versuche, eine SQL-Anweisung zu schreiben, um eine eindeutige Teilenummer basierend auf dem letzten Datum auszuwählen. Wenn ich nur die beiden Felder PartNo und ReceiveDate habe, könnte ich Folgendes tun:
"SELECT PartNo, Max(ReceiveDate) FROM Table GROUP BY PartNo;"
Und dies würde die eindeutige PartNo und das letzte Datum zurückgeben.
Das Problem ist, dass ich auch die Felder VendorName und Qty einschließen möchte (aber ich möchte nur, dass PartNo eindeutig ist). Ich habe es versucht:
"SELECT PartNo, VendorName, Qty, Max(ReceiveDate) FROM Table GROUP BY PartNo;"
Und
"SELECT PartNo, VendorName, Qty, Max(ReceiveDate) FROM Table GROUP BY PartNo, VendorName, Qty;"
Ich verstehe, warum diese beiden SELECT-Anweisungen falsch sind, die erste wird nicht ausgeführt, da VendorName und Qty nicht in der GROUP BY-Klausel oder einem Teil einer Aggregatfunktion enthalten sind, und in der zweiten wird ein eindeutiger Datensatz basierend auf PartNo AND ausgewählt VendorName AND Qty, nicht nur PartNo.
Wenn mir jemand helfen könnte, die richtige SQL-Anweisung zu schreiben, wäre das sehr zu begrüßen. Ich verwende Microsoft Access, das Jet SQL verwendet, das T-SQL sehr ähnlich ist.
3 Antworten
Ich würde eine korrelierte Unterabfrage vorschlagen:
SELECT t.*
FROM Table as t
WHERE t.ReceiveDate = (SELECT MAX(t2.ReceiveDate)
FROM Table as t2
WHERE t2.PartNo = t.PartNo
);
Dies kann insbesondere einen Index für (PartNo, ReceiveDate)
nutzen.
Versuchen Sie, eine Kreuztabellenabfrage zu verwenden:
SELECT DISTINCT X.PartNo,X.MaxDate,Y.VendorName,Y.Qty FROM
(SELECT PartNo, Max(ReceiveDate)MaxDate FROM Table GROUP BY PartNo)X,
(SELECT PartNo, VendorName, Qty From Table)Y
WHERE X.PartNo=Y.PartNo
Wenn Sie meinen, es ist Ihnen egal, aus welcher Zeile Vendorname und Qty stammen (per partNo), dann können Sie ihnen einfach eine aggregierte Funktion geben:
SELECT PartNo,
max(VendorName) as VendorName,
max(Qty) as Qty,
Max(ReceiveDate) as ReceiveDate
FROM [Table]
GROUP BY PartNo;
Wahrscheinlich wäre ein besserer Ansatz, diese VendorName und Qty aus der Zeile mit dem letzten Empfangsdatum abzurufen (ich gehe davon aus, dass die Gruppierung 1 Datum pro PartNum zurückgibt):
select t.PartNo, t.VendorName, t.Qty, tmp.LastDate as ReceiveDate
from (SELECT PartNo, Max(ReceiveDate) as lastDate
FROM [Table]
GROUP BY PartNo) tmp
inner join [Table] t on t.PartNo = tmp.PartNo
where t.ReceiveDate = tmp.lastDate;
Und ich nehme an, niemand würde wirklich eine Tabelle [Tabelle] nennen.
Verwandte Fragen
Verknüpfte Fragen
Neue Fragen
sql
Structured Query Language (SQL) ist eine Sprache zum Abfragen von Datenbanken. Zu den Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) gehören. Wenn sich Ihre Frage ausschließlich auf ein bestimmtes DBMS bezieht (bestimmte Erweiterungen / Funktionen verwendet), verwenden Sie stattdessen das Tag dieses DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten ISO / IEC-Standard-SQL verwenden.