最近公司需要分析物料单价与前一次变动价格的涨跌差异,之前使用rownumber方式解决遇到效能的问题。
在S.O发文求助后,从Squirrel大的回答学到可以使用OUTER APPLY + Order top 1
方式高效解决此问题。连结 : Stack Overflow 觉得有帮助记得帮Squirrel大按个Upvote。
举例 :
目前有採购明细资料如下 :
当使用者查询 order_date between 2020-02-02 and 2020-02-10
会希望得到以下结果
得出与最近一次採买,单价、成本的涨跌情况
逻辑像图片显示这样
Squirrel大主要利用apply
的特性,可以将外查询的值带入子查询
特性,以日期倒序
+ top 1
+ 单价不同条件
抓取同物料最后一笔不同单价的资料,至于使用OUTER
原因是以外查询为準
。
查询Script如下 :
SELECT *, unit_price_diff = T.[unit_price] - L.[last_unit_price_before]FROM TOUTER APPLY( SELECT TOP 1 last_unit_price_before = x.[unit_price], last_unit_price_change_date = x.[order_date] FROM T x WHERE x.[prdt_no] = T.[prdt_no] AND x.[order_date] < T.[order_date] AND x.[unit_price] <> T.[unit_price] ORDER BY x.[order_date] DESC) LWHERE T.[order_date] >= '2020-02-01' AND T.[order_date] <= '2020-02-10'
线上测试demo连结 : SQL Server 2012 | db<>fiddle