28

我正在尝试加入多个表,但其中一个表有多个记录,用于具有不同日期的 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)

那错误了。

我该怎么做才能得到我想要的结果。

4

10 回答 10

36

这是另一种不使用子查询的方法。这种方法通常会优于其他方法,因此值得测试这两种方法,看看哪种方法性能最佳。

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 的价格,这将给出多个结果(大多数其他解决方案也会这样做)。此外,我没有什么可以解释最后一个价格日期是在未来。无论您最终使用哪种方法,您都可能需要考虑进行检查。

于 2009-05-18T19:00:18.183 回答
34

试试这个:

Select *,
    Price = (Select top 1 Price 
             From MyPrices 
             where PartID = mp.PartID 
             order by PriceDate desc
            )
from MyParts mp
于 2009-05-18T18:32:43.790 回答
11
SELECT
    MyParts.*,MyPriceDate.Price,MyPriceDate.PriceDate
    FROM MyParts
        INNER JOIN (SELECT Partid, MAX(PriceDate) AS MaxPriceDate FROM MyPrice GROUP BY Partid) dt ON MyParts.Partid = dt.Partid
        INNER JOIN MyPrice ON dt.Partid = MyPrice.Partid AND MyPrice.PriceDate=dt.MaxPriceDate
于 2009-05-18T18:31:40.253 回答
7

在 SQL Server 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
于 2009-05-18T21:30:11.140 回答
5

像这样的东西

SELECT * 
FROM MyParts 
LEFT JOIN 
(
SELECT MAX(PriceDate), PartID FROM MyPrice group by PartID
) myprice
 ON MyParts.Partid = MyPrice.Partid 

如果你知道你的partid或者可以限制它把它放在join里面。

   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
于 2009-05-18T18:33:24.523 回答
3
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 的最新价格日期(标准汇总),然后将其加入以获取价格(不能汇总),然后获取零件详细信息。

于 2009-05-18T18:32:24.307 回答
3

加入价格表,然后选择最后一天的条目:

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
)

PS改用wcm的解决方案!

于 2009-05-18T18:39:45.617 回答
2

所有其他答案必须有效,但使用相同的语法(并理解错误原因)

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)
于 2009-05-18T18:45:11.643 回答
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)
于 2017-11-08T07:45:24.920 回答
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 获取 max pricedate,然后使用 partid 和max_priceate与 MyParts 进行内部连接

于 2018-06-25T00:36:29.487 回答