2016-02-19 45 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