28 Stimmen

T-SQL Unterabfrage Max(Datum) und Joins

Ich versuche, mehrere Tabellen zu verbinden, aber eine der Tabellen hat mehrere Datensätze für eine partid mit unterschiedlichen Daten. Ich möchte den Datensatz mit dem aktuellsten Datum abrufen.

Hier sind einige Beispieltabellen:

Table: MyParts
Partid   Partnumber   Description
1        ABC-123      Pipe
2        ABC-124      Handle
3        ABC-125      Light

Table: MyPrices
Partid   Price        PriceDate
1        $1           1/1/2005
1        $2           1/1/2007
1        $3           1/1/2009
2        $2           1/1/2005
2        $4           1/1/2006
2        $5           1/1/2008
3        $10          1/1/2008
3        $12          1/1/2009

Wenn ich nur den letzten Preis für ein bestimmtes Teil finden wollte, könnte ich das tun:

SELECT * FROM MyPrice WHERE PriceDate = (SELECT MAX(PriceDate) 
FROM MyPrice WHERE Partid = 1)

Ich möchte jedoch zuerst eine Verbindung herstellen und den korrekten Preis für alle Teile zurückerhalten, nicht nur für eines. Das habe ich versucht:

SELECT * FROM MyParts LEFT JOIN MyPrice ON MyParts.Partid = MyPrice.Partid WHERE 
MyPart.PriceDate = (SELECT MAX(PriceDate) FROM MyPrice)

Die Ergebnisse sind falsch, da das höchste Preisdatum der gesamten Tabelle genommen wird.

SELECT * FROM MyParts LEFT JOIN MyPrice ON MyParts.Partid = MyPrice.Partid WHERE 
MyPart.PriceDate = (SELECT MAX(PriceDate) FROM MyPrice WHERE MyPrice.Partid =   
MyParts.Partid)

Das ist ein Fehler.

Was kann ich tun, um die gewünschten Ergebnisse zu erzielen?

3voto

gbn Punkte 407102
SELECT
    *
FROM
    (SELECT MAX(PriceDate) AS MaxP, Partid FROM MyPrices GROUP BY Partid) MaxP 
    JOIN
    MyPrices MP On MaxP.Partid = MP.Partid AND MaxP.MaxP = MP.PriceDate
    JOIN
    MyParts P ON MP.Partid = P.Partid

Sie müssen zuerst das letzte Preisdatum für partid abrufen (ein Standardaggregat), dann die Preise abrufen (die nicht im Aggregat enthalten sein können) und anschließend die Artikeldetails abrufen.

3voto

Andomar Punkte 224164

Klicken Sie auf die Preistabelle und wählen Sie dann den Eintrag für den letzten Tag:

select pa.partid, pa.Partnumber, max(pr.price)
from myparts pa
inner join myprices pr on pr.partid = pa.partid
where pr.PriceDate = (
    select max(PriceDate) 
    from myprices 
    where partid = pa.partid
)

Die max() ist für den Fall, dass es mehrere Preise pro Tag gibt; ich gehe davon aus, dass Sie den höchsten Preis anzeigen möchten. Wenn Ihre Preistabelle eine id-Spalte hat, können Sie die max() vermeiden und wie folgt vereinfachen:

select pa.partid, pa.Partnumber, pr.price
from myparts pa
inner join myprices pr on pr.partid = pa.partid
where pr.priceid = (
    select max(priceid)
    from myprices 
    where partid = pa.partid
)

P.S. Verwenden Sie stattdessen die Lösung von wcm!

2voto

Eduardo Molteni Punkte 37808

Alle anderen Antworten müssen funktionieren, aber mit der gleichen Syntax (und dem Verständnis, warum der Fehler auftritt)

SELECT * FROM MyParts LEFT JOIN MyPrice ON MyParts.Partid = MyPrice.Partid WHERE 
MyPart.PriceDate = (SELECT MAX(MyPrice2.PriceDate) FROM MyPrice as MyPrice2 
WHERE MyPrice2.Partid =  MyParts.Partid)

0voto

Rupal Punkte 51

Bitte versuchen Sie das nächste Codebeispiel:

select t1.*, t2.partprice, t2.partdate 
from myparts t1
join myprices t2 
on t1.partid = t2.partid
where partdate = 
(select max(partdate) from myprices t3 
where t3.partid = t2.partid group by partid)

0voto

Suren Punkte 37

Für MySQL, finden Sie die untenstehende Abfrage:

select * from (select PartID, max(Pricedate) max_pricedate from MyPrices group bu partid) as a 
    inner join MyParts b on
    (a.partid = b.partid and a.max_pricedate = b.pricedate)

In der Unterabfrage wird dann für jede partyid von MyPrices das maximale Preisdatum abgefragt, inner join mit MyParts unter Verwendung von partid und der maximales_Preisdatum

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X