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

Posted

技术标签:

【中文标题】SQL 难题,如何选择零件的最新日期,但每个零件只有 1 行(唯一)【英文标题】:SQL conundrum, how to select latest date for part, but only 1 row per part (unique) 【发布时间】:2011-04-10 07:04:57 【问题描述】:

今天早上我正试图解决这个问题。

我正在尝试显示零件的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

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

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

我最终会做一个

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

限制我需要的部分。希望我的问题足够清楚。让我知道你是否有想法。我不能做DISTINCT,因为行不一样,日期必须是最新的,而且我最多需要 X 行。

想法?我卡住了……

【问题讨论】:

【参考方案1】:
  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

【讨论】:

【参考方案2】:

编辑:一定要测试每个解决方案的性能。正如this question 中指出的那样,使用 ROW_NUMBER 时,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

【讨论】:

【参考方案3】:

你需要加入一个子查询:

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

【讨论】:

以上是关于SQL 难题,如何选择零件的最新日期,但每个零件只有 1 行(唯一)的主要内容,如果未能解决你的问题,请参考以下文章

使用SQL语言,求每个工程项目使用供应零件的总数量。

在 Oracle SQL 查询中选择最新的

同一零件存在多行时需要查找零件数据

solidworks 可以只显示某草图或者某个零件对其编辑吗?

Forge:选择单个零件:无法在零件之间切换

数据库原理难题,设有一个SPJ数据库,包括S,P,J,SPJ四个关系模式