让我简要描述我正在尝试的事情,以防有人有更优雅的方法来解决同样的问题。我正在尝试编写一个存储过程来查看数据库中的销售订单,查找同一客户多次订购同一项目的时间,并使用订单之间的先前间隔的平均值来预测订单的下一个日期同一个项目。下面的查询将构成临时表与可能的游标和运行平均值一起工作的基础。
到目前为止,我的查询看起来像这样
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个小时。
我知道基本的问题是我在外部应用,所以它可能通过痛苦的行处理来排队,但我不确定另一种方式来听到它会更快地运行。有什么想法吗?
答案 0 :(得分:1)
我认为你使它变得比它需要的更复杂 只需取最小值和最大值并除以计数
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