让我简要描述一下我正在尝试什么,以防有人有更优雅的方式来解决同样的问题。我正在尝试编写一个存储过程来查看数据库中的销售订单,查找同一客户何时多次订购同一商品,并使用订单之间先前间隔的平均值预测订单的下一个日期同一个项目。下面的查询将构成临时表的基础,以处理可能的游标和运行平均值。
到目前为止,我的查询看起来像这样
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 小时。
我知道基本问题是我在外部应用,所以它可能是通过痛苦的行处理来做行,但我不确定另一种方法可以更快地听到它。有什么想法吗?