2010-09-09 12 views
5

Ich versuche, meinen Kopf heute Morgen um diesen einen zu wickeln.SQL-Rätsel, wie das späteste Datum für Teil auswählen, aber nur 1 Reihe pro Teil (einzigartig)

Ich versuche, inventory Status für Teile (für unsere Produkte) zu zeigen, und diese Abfrage wird nur komplex, wenn ich versuche, alle Teile zurückzugeben.

Lassen Sie es mich auslegen:

  • einzige Tabelle inventoryReport
  • Ich habe eine eindeutige Liste von X Teilen I angezeigt werden soll, wobei das Ergebnis davon X Anzahl der Zeilen sein muß (1 Zeile pro Teil zeigt den letzten Inventareintrag).
  • Tabelle enthält veraltete Einträge von Bestandsänderungen (so brauche ich nur die LATEST Datumseingabe pro Teil).
  • alle Daten in dieser Tabelle enthalten, so dass keine Joins erforderlich sind.

Zeit 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 Reihe meiner TOP 1 bekommt, so einfach pro Teil, aber ich muss alle X zeigen (sagen wir 30 Teile). Also brauche ich 30 Zeilen mit diesem Ergebnis. Natürlich wäre die einfache Lösung, X # von SQL-Aufrufen in meinem Code zu loopen (aber es wäre teuer), und das würde ausreichen, aber zu diesem Zweck würde ich gerne dieses SQL etwas mehr bearbeiten, um die x # -Aufrufe zurück auf die db zu reduzieren (wenn nicht benötigt) bis zu 1 Abfrage.

Von dem, was ich hier sehen kann, muss ich irgendwie auf der Suche nach meinem Ergebnis-Set das aktuelle Datum pro Stück verfolgen.

würde ich schließlich tun ein

WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc) 

die Teile zu begrenzen, was ich brauche. Hoffentlich machte ich meine Frage klar genug. Lass es mich wissen, wenn du eine Idee hast. Ich kann keine DISTINCT tun, da die Zeilen nicht die selben sind, das Datum muss das späteste sein, und ich benötige ein Maximum von X Reihen.

Gedanken? Ich bin fest ...

Antwort

2

EDIT: Sicherstellen, dass die Leistung jeder Lösung zu testen. Wie in this question gezeigt, kann die CTE-Methode mit ROW_NUMBER übertreffen.

;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 
5
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 
2

Sie müssen sich in einer 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 
Verwandte Themen