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.

0
person1234568475 19 Aug. 2020 im 15:36

3 Antworten

Beste Antwort

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.

0
Gordon Linoff 19 Aug. 2020 im 12:47

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
0
Olga Romantsova 19 Aug. 2020 im 14:23

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.

0
Cetin Basoz 19 Aug. 2020 im 12:45