我在SQLServer中有一个查询,它返回给定产品库存中的最后一个条目,以及许多其他列。类似的东西:
SELECT
TOP(1) EntryDate,
EntryPrice,
TaxID,
TransportCost,
...
FROM
StockEntries
WHERE
ProductID = @ID
ORDER BY
EntryDate DESC
我不能使用MAX来获取最后一个条目,因为有时它会返回重复的行(当同一天有两个条目时)。
我想为我们拥有的每件产品执行此查询。如果查询只返回1行,我可以这样做,例如:
SELECT
ProductID p,
(
SELECT
TOP(1) s.EntryDate
FROM
StockEntries s
WHERE
s.ProductID = p.ProductID
ORDER BY
s.EntryDate DESC
)
FROM
Products p
但是当它返回多行时,我看不到直接的方法来做到这一点。
有什么想法吗?
答案 0 :(得分:2)
正如你所说的那样,cross apply
似乎非常合适:
SELECT p.*, s.*
FROM products p CROSS APPLY
(SELECT TOP(1) s.*
FROM StockEntries s
WHERE s.ProductID = p.ProductID
ORDER BY s.EntryDate DESC
) s;
APPLY
还允许您从StockEntries
中选择其他列。
答案 1 :(得分:1)
您可以使用ROW_NUMBER()对每行进行排名,然后只获取每件产品的最高日期行数。
SELECT *
FROM (SELECT p.productid,
s.EntryDate,
s.EntryPrice,
s.TaxID,
s.TransportCost,
ROW_NUMBER() OVER (PARTITION BY p.productid ORDER BY s.entrydate DESC) rownum
FROM products p
JOIN StockEntries s ON s.ProductID = p.ProductID
) t
WHERE rownum = 1