在我做的ERP专案中,有一个最新单价明细的功能,即是从单价资料中,算出是否属于最新单价。
规则:料号(ItemID)+客户(CustID)唯一&&生效日期(BeginDate)<=当天&&生效日期最大&&且最后维护的那一行(SPriceID是自动增量字段)记录。即是属于最新单价。
原来的写法:
Select A.ItemID,A.CustID,Max(A.SPriceID) as SPriceID From SalseItemPrice A Inner join (
select ItemID,CustID,Max(Convert(Nvarchar,BeginDate,111)) as BeginDate From SalseItemPrice Where Isdel=0 and IsPass<5 and Convert(Nvarchar,BeginDate,111)<=Convert(Nvarchar,GetDate(),111) Group by ItemID,CustID) B
On A.ItemID=B.ItemID and A.CustID=B.CustID and convert(Nvarchar,A.BeginDate,111)=Convert(Nvarchar,B.BeginDate,111) Where A.Isdel=0 and A.IsPass<5 Group By A.ItemID,A.CustID
在加载50000行记录时,需要5分钟左右,才能算出返回。
经研究后,改成以下写法:
SELECT ItemID,CustID,MAX(convert(bigint,BeginDate,112)*1000000000+SPriceID)AS MaxID
FROM SalseItemPrice WHERE IsDel=0 AND IsPass<5 AND BeginDate<= GETDATE() Group By ItemID,CustID
在加载50000行记录时,需要3-4秒左右,就可以算出返回。看到速度的提升,我又积攒了一点智慧财富了。
如果您还有更优的方案,欢迎回复。如蒙不吝赐教,小弟不胜感激!