SQL难题,如何选择零件的最新日期,但每个零件只有1行(唯一)
-
01-10-2019 - |
题
我今天早上试图将头缠住。
我想展示 inventory
零件的状态(对于我们的产品),只有当我尝试返回所有零件时,此查询才变得复杂。
让我布置:
- 单个表
inventoryReport
- 我有一个不同的X零件列表,其结果必须是行的x#(每部分1行显示最新的库存条目)。
- 表由库存更改的过时条目组成(因此,我只需要
LATEST
每个部分的日期输入)。 - 该表中包含的所有数据,因此无需加入。
目前,这很简单,我可以通过执行以下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行。
想法?我卡住了...
解决方案
编辑: :确保测试每个解决方案的性能。正如指出 这个问题, ,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
其他提示
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
不隶属于 StackOverflow