从每个产品ID的多列查询中选择Top1

时间:2016-02-19 15:26:01

标签: sql sql-server

我在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

但是当它返回多行时,我看不到直接的方法来做到这一点。

有什么想法吗?

2 个答案:

答案 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