SQL难题,如何选择部件的最新日期,但每个部件只有1行(唯一)

时间:2010-09-09 14:11:33

标签: sql sql-server sql-server-2005 inventory

我今天早上试图绕过这个。

我正在尝试显示部件(我们的产品)的inventory状态,如果我尝试返回所有部件,此查询将变得复杂。

让我说出来:

  • 单人表inventoryReport
  • 我有一个我希望显示的X部分的明显列表,其结果必须是X#行(每个部分1行显示最新的库存条目)。
  • 表由库存更改的日期条目组成(因此我每个零件只需要LATEST日期条目。)
  • 此单个表中包含的所有数据,因此无需加入。

目前只有1个单一部分,它相当简单,我可以通过执行以下sql来实现这一点(为了给你一些想法):

SELECT     TOP (1) ldDate, ptProdLine, inPart, inSite, inAbc, ptUm, inQtyOh + inQtyNonet AS in_qty_oh, inQtyAvail, inQtyNonet, ldCustConsignQty, inSuppConsignQty
FROM         inventoryReport
WHERE     (ldPart = 'ABC123')
ORDER BY ldDate DESC

这让我成为我的前1行,每个部分都很简单,但我需要显示所有X(比方说30个部分)。所以我需要30行,结果如此。当然,简单的解决方案是在我的代码中循环X#的sql调用(但这会很昂贵)并且这就足够了,但为了这个目的,我希望更多地使用这个SQL来减少x#调用回db (如果不需要)只需1个查询。

从我在这里看到的,我需要在查找结果集时以某种方式跟踪每个项目的最新日期。

我最终会做一个

WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)

限制我需要的部件。希望我的问题足够清楚。如果您有任何想法,请告诉我。我不能做DISTINCT因为行不一样,日期需要是最新的,我需要最多X行。

思考?我被卡住了......

3 个答案:

答案 0 :(得分:5)

  SELECT *
  FROM   (SELECT i.*,
      ROW_NUMBER() OVER(PARTITION BY ldPart ORDER BY ldDate DESC) r
      FROM   inventoryReport i
      WHERE  ldPart in ('ABC123', 'BFD21', 'AA123', etc)
         )
  WHERE  r = 1

答案 1 :(得分:2)

您需要加入子查询:

SELECT i.ldPart, x.LastDate, i.inAbc
FROM inventoryReport i
INNER JOIN (Select ldPart, Max(ldDate) As LastDate FROM inventoryReport GROUP BY ldPart) x
on i.ldPart = x.ldPart and i.ldDate = x.LastDate

答案 2 :(得分:2)

编辑:请务必测试每个解决方案的效果。正如this question中所指出的,CTE方法可能会优于使用ROW_NUMBER。

;with cteMaxDate as (
    select ldPart, max(ldDate) as MaxDate
        from inventoryReport
        group by ldPart
)
SELECT md.MaxDate, ir.ptProdLine, ir.inPart, ir.inSite, ir.inAbc, ir.ptUm, ir.inQtyOh + ir.inQtyNonet AS in_qty_oh, ir.inQtyAvail, ir.inQtyNonet, ir.ldCustConsignQty, ir.inSuppConsignQty
    FROM cteMaxDate md
        INNER JOIN inventoryReport ir
            on md.ldPart = ir.ldPart
                and md.MaxDate = ir.ldDate