SQL难题,如何为零件选择最新日期,但每个零件仅1行(唯一)

SQL难题,如何为零件选择最新日期,但每个零件仅1行(唯一),sql,sql-server,sql-server-2005,inventory,Sql,Sql Server,Sql Server 2005,Inventory,今天早上我想把我的头绕在这个上面 我正在尝试显示产品零件的库存状态,只有在我尝试返回所有零件时,此查询才会变得复杂 让我来说明一下: 单表清单报告 我有一个我想显示的X个零件的独特列表,其结果必须是X行,每个零件1行,显示最新的库存条目。 表由库存变化的日期条目组成,所以我只需要每个零件的最新日期条目。 所有数据都包含在这个表中,因此不需要联接。 目前,对于1个单独的部分,它相当简单,我可以通过执行以下sql来实现这一点,让您了解一些情况: SELECT TOP (1) ldDate,

今天早上我想把我的头绕在这个上面

我正在尝试显示产品零件的库存状态,只有在我尝试返回所有零件时,此查询才会变得复杂

让我来说明一下:

单表清单报告 我有一个我想显示的X个零件的独特列表,其结果必须是X行,每个零件1行,显示最新的库存条目。 表由库存变化的日期条目组成,所以我只需要每个零件的最新日期条目。 所有数据都包含在这个表中,因此不需要联接。 目前,对于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
这就得到了我的第一行,每个部分都很简单,但是我需要显示所有的X,比如说30个部分。所以我需要30行,这样的结果。当然,简单的解决方案是在我的代码中循环X个sql调用,但这将是昂贵的,这就足够了,但出于这个目的,我希望更多地使用此sql来减少对db的X调用(如果不需要的话),减少到仅1个查询

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

我最终会做一个

WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)
限制我需要的零件。希望我把问题说得足够清楚。如果你有什么想法,请告诉我。我无法执行DISTINCT,因为行不相同,日期必须是最新的,并且我最多需要X行


想法?我被卡住了…

您需要加入子查询:

  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
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
编辑:确保测试每个解决方案的性能。正如中所指出的,CTE方法可能优于使用行数

;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