Jak*_*kub 5 sql sql-server sql-server-2005 inventory
我今天早上试图绕过这个.
我试图显示inventory部件的状态(对于我们的产品),如果我尝试返回所有部件,此查询将变得复杂.
让我说出来:
inventoryReportLATEST日期条目组成(因此我只需要每个部分的日期条目).目前只有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
Run Code Online (Sandbox Code Playgroud)
这让我成为我的前1行,每个部分都很简单,但我需要显示所有X(比方说30个部分).所以我需要30行,结果如此.当然,简单的解决方案是在我的代码中循环X#的sql调用(但这会很昂贵)并且这就足够了,但为了这个目的,我希望更多地使用这个SQL来减少x#调用回db (如果不需要)只需1个查询.
从我在这里看到的,我需要在寻找我的结果集时以某种方式跟踪每个项目的最新日期.
我最终会做一个
WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)
Run Code Online (Sandbox Code Playgroud)
限制我需要的部分.希望我的问题足够清楚.如果您有任何想法,请告诉我.我不能这样做,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
Run Code Online (Sandbox Code Playgroud)
编辑:请务必测试每个解决方案的性能。正如这个问题所指出的,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
Run Code Online (Sandbox Code Playgroud)