[英]Improving performance of outer apply
让我简短地描述一下,如果某人拥有解决同一问题的更为优雅的方法,我将尝试做些什么。 我正在尝试编写一个存储过程,以查看数据库中的销售订单,查找同一客户多次订购同一商品的时间,并使用订单之间先前间隔的平均值来预测订单的下一个日期相同的项目。 下面的查询将构成临时表与可能的游标和移动平均值相对应的基础。
到目前为止,我有这样的查询
SELECT sl.custaccount ,
sl.itemid ,
sl.shippingdaterequested ,
nextdate.shippingdaterequested AS nextshippingdaterequested
FROM salesline AS sl
OUTER APPLY ( SELECT TOP 1
sl2.custaccount ,
sl2.itemid ,
sl2.shippingdaterequested
FROM salesline AS sl2
WHERE sl2.shippingdaterequested > sl.shippingdaterequested
AND sl2.custaccount = sl.custaccount
AND sl2.itemid = sl.itemid
GROUP BY sl2.custaccount ,
sl2.itemid ,
sl2.shippingdaterequested
ORDER BY sl2.shippingdaterequested
) AS nextdate
GROUP BY sl.custaccount ,
sl.itemid ,
sl.shippingdaterequested ,
nextdate.shippingdaterequested
该查询为我提供了每个销售行的一行,并有一列代表该客户下一次订购该商品的时间。 如果该列为NULL,那么我知道我的记录是最后一次。
基本问题是此查询的速度太慢,如果我一次遇到一个客户,它会很好地运行,在一秒钟内返回结果,但是针对约100,000个客户,则大约需要27个小时。
我知道基本的问题是我正在外部应用程序,所以它可能是通过烦恼行处理来进行行处理,但是我不确定另一种方法可以更快地解决问题。 有什么想法吗?
我认为您正在使它变得比所需的更加复杂。
只需取最小值和最大值并除以计数
SELECT sl.custaccount ,
sl.itemid ,
MAX(sl.shippingdaterequested) AS lastShip ,
DATEDIFF(dd, MIN(sl.shippingdaterequested),
MAX(sl.shippingdaterequested)) / COUNT(*) AS interval ,
DATEADD(dd,
DATEDIFF(dd, MIN(sl.shippingdaterequested),
MAX(sl.shippingdaterequested)) / COUNT(*),
MAX(sl.shippingdaterequested)) AS nextShip
FROM salesline AS sl
GROUP BY sl.custaccount ,
sl.itemid
HAVING COUNT(*) > 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.