我正在尝试连接多个表,但其中一个表有一个具有不同日期的partid的多个记录。我希望得到最近日期的记录。
以下是一些示例表:
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
如果我只是想找到某个部分的最新价格,我可以这样做:
SELECT * FROM MyPrice WHERE PriceDate = (SELECT MAX(PriceDate)
FROM MyPrice WHERE Partid = 1)
但是我想首先加入,然后为所有部分(不仅仅是一部分)找回正确的价格。这就是我的尝试:
SELECT * FROM MyParts LEFT JOIN MyPrice ON MyParts.Partid = MyPrice.Partid WHERE
MyPart.PriceDate = (SELECT MAX(PriceDate) FROM MyPrice)
结果是错误的,因为它占据整个表格的最高价格日期。
SELECT * FROM MyParts LEFT JOIN MyPrice ON MyParts.Partid = MyPrice.Partid WHERE
MyPart.PriceDate = (SELECT MAX(PriceDate) FROM MyPrice WHERE MyPrice.Partid =
MyParts.Partid)
错误。
我可以做些什么来获得我想要的结果。
答案 0 :(得分:31)
试试这个:
Select *,
Price = (Select top 1 Price
From MyPrices
where PartID = mp.PartID
order by PriceDate desc
)
from MyParts mp
答案 1 :(得分:31)
这是在没有子查询的情况下执行此操作的另一种方法。这种方法通常会优于其他方法,因此值得测试两种方法,以确定哪种方法能够提供最佳性能。
SELECT
PRT.PartID,
PRT.PartNumber,
PRT.Description,
PRC1.Price,
PRC1.PriceDate
FROM
MyParts PRT
LEFT OUTER JOIN MyPrices PRC1 ON
PRC1.PartID = PRT.PartID
LEFT OUTER JOIN MyPrices PRC2 ON
PRC2.PartID = PRC1.PartID AND
PRC2.PriceDate > PRC1.PriceDate
WHERE
PRC2.PartID IS NULL
如果您有两个具有相同EXACT PriceDate的价格(大多数其他解决方案将执行相同操作),这将给出多个结果。另外,我没有什么可以解释将来的最后价格日期。无论您最终使用哪种方法,都可能需要考虑检查。
答案 2 :(得分:10)
尝试加入MyPrice
的子查询以检索MAX(PriceDate)
:
SELECT a.*, MyPriceDate.Price, MyPriceDate.PriceDate
FROM MyParts a
INNER JOIN (
SELECT Partid, MAX(PriceDate) AS MaxPriceDate
FROM MyPrice
GROUP BY Partid
) dt ON a.Partid = dt.Partid
INNER JOIN MyPrice ON dt.Partid = MyPrice.Partid
AND a.PriceDate = dt.MaxPriceDate
答案 3 :(得分:5)
2005年使用ROW_NUMBER()
:
SELECT * FROM
( SELECT p.*,
ROW_NUMBER() OVER(PARTITION BY Partid ORDER BY PriceDate DESC) AS rn
FROM MyPrice AS p ) AS t
WHERE rn=1
答案 4 :(得分:4)
像这样的东西
SELECT *
FROM MyParts
LEFT JOIN
(
SELECT MAX(PriceDate), PartID FROM MyPrice group by PartID
) myprice
ON MyParts.Partid = MyPrice.Partid
如果你知道你的partid或者可以限制它,就把它放在连接中。
SELECT myprice.partid, myprice.partdate, myprice2.Price, *
FROM MyParts
LEFT JOIN
(
SELECT MAX(PriceDate), PartID FROM MyPrice group by PartID
) myprice
ON MyParts.Partid = MyPrice.Partid
Inner Join MyPrice myprice2
on myprice2.pricedate = myprice.pricedate
and myprice2.partid = myprice.partid
答案 5 :(得分:2)
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
您首先获得partid的最新定价(标准汇总),然后将其加入以获取价格(不能合计),然后获取零件详细信息。
答案 6 :(得分:2)
加入价格表,然后选择最后一天的条目:
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
)
max()用于每天有多个价格;我假设你想展示最高的一个。如果您的价格表有一个id列,您可以避免使用max()并简化如下:
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。改为使用wcm的解决方案!
答案 7 :(得分:1)
所有其他答案必须有效,但使用相同的语法(并理解错误原因)
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)
答案 8 :(得分:0)
请尝试下一个代码示例:
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)
答案 9 :(得分:0)
对于MySQL,请找到以下查询:
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)
在子查询中,它为MyPrices的每个partyid获取最大pricedate, 使用partid和 max_price_rate
与MyParts内部连接