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

标签 sql sql-server sql-server-2005 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# 调用(如果不需要)减少到只有 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

关于SQL 难题,如何选择零件的最新日期,但每个零件只有 1 行(唯一),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3677390/

相关文章:

sql-server - 如何应用非标准 SQL 列排序顺序?

asp.net - count(*) 真的很贵吗?

sql-server - 哪个插入速度更快,XML 字段还是 Varchar(max) 字段?

mysql - 更改表错误

sql - 分析表,优化表,多久一次?

sql - 证明 XML 字段上的主索引不会使检索速度更快

sql-server - 在没有删除的情况下使一个表等于另一个表 *

sql-server - 在 SQL Server 2012 中将 varbinary() 转换为 varchar(max) 时如何编码特定语言的字符?

SQL Server 2005/2008 不使用动态 SQL 的带参数的 Group By 语句?

mysql - SQL 将字符转换为 bool 值