2016-02-19 47 views
1

我在SQLServer中有一个查询,它返回给定产品库存中的最后一个条目以及许多其他列。喜欢的东西:从每个产品ID的多列查询中选择Top1

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 

但因为它返回多行,我看不到一条直线的方式来做到这一点。

任何想法?

回答

1

正如你所表述的问题,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选择其他列。

+0

那就是我在找的东西。谢谢! –

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