SQL Rätsel, wie letzten Termin für einen Teil auszuwählen, aber nur 1 Zeile pro Teil (unique)
-
01-10-2019 - |
Frage
Ich versuche, meinen Kopf um diese heute Morgen zu wickeln.
Ich versuche inventory
Status für Teile zu zeigen (für unsere Produkte) und diese Abfrage wird nur komplex, wenn ich versuche, alle Teile zurück.
Lassen Sie es mich auslegen:
- einzelne Tabelle
inventoryReport
- Ich habe eine eindeutige Liste von X Teilen I angezeigt werden soll, das Ergebnis der X Anzahl der Zeilen (1 Zeile pro Teil neuestes Inventar Eintrag angezeigt) sein muss.
- Tisch ist aus datiert Einträgen von Bestandsveränderungen aus (so dass ich nur den
LATEST
Datumseintrag pro Teil benötigen). - alle in dieser einzigen Tabelle enthaltenen Daten, so dass keine Verknüpfungen notwendig.
Derzeit für 1 Einzelteil, ist es ziemlich einfach ist, und ich kann dies erreichen, indem Sie die folgende SQL tun (Ihnen eine Vorstellung geben):
SELECT TOP (1) ldDate, ptProdLine, inPart, inSite, inAbc, ptUm, inQtyOh + inQtyNonet AS in_qty_oh, inQtyAvail, inQtyNonet, ldCustConsignQty, inSuppConsignQty
FROM inventoryReport
WHERE (ldPart = 'ABC123')
ORDER BY ldDate DESC
, die mir meine TOP 1 Reihe bekommt, so einfach pro Teil, jedoch muss ich alle X zeigen (lässt 30 Teile sagen). Also muss ich 30 Zeilen, mit diesem Ergebnis. Natürlich würde die einfache Lösung Schleife X Anzahl der SQL-Aufrufe in meinem Code (aber es wäre teuer) und das würde ausreichen, aber für diesen Zweck würde ich lieben diese SQL etwas mehr zu arbeiten, um die x # Anrufe an die DB zurück zu reduzieren (falls erforderlich) auf nur 1 Abfrage.
Von dem, was ich hier sehe, kann ich den Überblick über den jeweils neuesten Termin pro Stück halten müssen irgendwie während für meine Ergebnismenge suchen.
Ich würde letztlich tun, um ein
WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)
, um die Teile zu begrenzen, was ich brauche. Hoffentlich habe ich meine Frage klar genug. Lassen Sie uns wissen, wenn Sie eine Idee haben. Ich kann keine DISTINCT
tun, wie die Zeilen nicht die gleichen sind, wird das Datum Bedürfnisse der neuesten sein, und ich brauche ein Maximum von X Zeilen.
Die Gedanken? Ich bin fest ...
Lösung
Bearbeiten : Stellen Sie sicher, dass die Leistung jeder Lösung zu testen. Wie bereits ausgeführt in diese Frage kann die CTE-Methode ROW_NUMBER entwickeln.
;with cteMaxDate as (
select ldPart, max(ldDate) as MaxDate
from inventoryReport
group by ldPart
)
SELECT md.MaxDate, ir.ptProdLine, ir.inPart, ir.inSite, ir.inAbc, ir.ptUm, ir.inQtyOh + ir.inQtyNonet AS in_qty_oh, ir.inQtyAvail, ir.inQtyNonet, ir.ldCustConsignQty, ir.inSuppConsignQty
FROM cteMaxDate md
INNER JOIN inventoryReport ir
on md.ldPart = ir.ldPart
and md.MaxDate = ir.ldDate
Andere Tipps
SELECT *
FROM (SELECT i.*,
ROW_NUMBER() OVER(PARTITION BY ldPart ORDER BY ldDate DESC) r
FROM inventoryReport i
WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)
)
WHERE r = 1
Sie müssen sich in einem Sub-Abfrage beitreten:
SELECT i.ldPart, x.LastDate, i.inAbc
FROM inventoryReport i
INNER JOIN (Select ldPart, Max(ldDate) As LastDate FROM inventoryReport GROUP BY ldPart) x
on i.ldPart = x.ldPart and i.ldDate = x.LastDate