2

我有一张名为“购买”的表:

购买 ID、购买日期、供应商

╔════════════╦══════════════╦════════╗
║ PurchaseID ║ PurchaseDate ║ Vendor ║
╠════════════╬══════════════╬════════╣
║          1 ║ 01 jan 2013  ║ XYZ    ║
║          2 ║ 02 jan 2013  ║ ABC    ║
╚════════════╩══════════════╩════════╝

以及使用 PurchaseID 键与其链接的表“PurchaseDetails”:

DetailID、PurchaseID、ProductCode、Price

╔══════════╦════════════╦═════════════╦═══════╗
║ DetailID ║ PurchaseID ║ ProductCode ║ Price ║
╠══════════╬════════════╬═════════════╬═══════╣
║        1 ║          1 ║         001 ║ 2.34  ║
║        2 ║          1 ║         002 ║ 3.75  ║
║        3 ║          2 ║         001 ║ 5.93  ║
║        4 ║          2 ║         002 ║ 8.14  ║
╚══════════╩════════════╩═════════════╩═══════╝

我想获取给定 ProductCode 的最后一个 PurchaseDate 的价格和供应商。

例如:如果 ProductCode 是“001”,那么我希望查询返回:5.93 | 美国广播公司

我尝试使用带有 DESC ORDER BY 的 TOP 1 SELECT,但我无法让 JOIN 部分工作。

4

3 回答 3

1

使用 TOP1 方法,以下查询应该可以工作

SELECT Vendor, Price
FROM Purchases p
INNER JOIN PurchaseDetails pd on pd.PurchaseID=p.PurchaseID
WHERE PurchaseID = (SELECT TOP 1 PurchaseID FROM Purchases WHERE DetailID = DetailID ORDER BY PurchaseDate DESC)

您也可以使用Row_Number来实现这一点

于 2013-06-17T13:27:28.110 回答
0

这是我的解决方案:

SELECT TOP 1 Purchases.Vendor, Purchases.PurchaseDate, PurchaseDetails.Price FROM PurchaseDetails INNER JOIN Purchases 
ON PurchaseDetails.PurchaseID=Purchases.PurchaseID WHERE PurchaseDetails.ProductCode='001' ORDER BY Purchases.PurchaseDate DESC
于 2013-06-17T13:27:41.960 回答
0

由于您使用的是 SQL Server 2005+,因此您可以使用窗口函数来获取结果。在这种情况下,我使用row_number()

select vendor, price
from
(
  select p.purchaseId, p.purchaseDate, p.vendor,
    d.productCode, d.price,
    row_number() over(partition by d.productCode order by p.purchaseDate desc) seq
  from purchases p
  inner join purchaseDetails d
    on p.purchaseId = d.purchaseId
) src
where seq = 1;

请参阅带有演示的 SQL Fiddle

于 2013-06-19T03:30:30.387 回答