今天早上我想把头缠起来。
我试图显示inventory零件状态(针对我们的产品),并且仅当我尝试退回所有零件时,此查询才会变得复杂。
inventory
让我来说明一下:
inventoryReport
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行。
DISTINCT
有什么想法吗?我被困住了…
编辑 :请确保测试每个解决方案的性能。正如该问题所指出的那样,使用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