0

让我简要描述一下我正在尝试什么,以防有人有更优雅的方式来解决同样的问题。我正在尝试编写一个存储过程来查看数据库中的销售订单,查找同一客户何时多次订购同一商品,并使用订单之间先前间隔的平均值预测订单的下一个日期同一个项目。下面的查询将构成临时表的基础,以处理可能的游标和运行平均值。

到目前为止,我的查询看起来像这样

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 小时。

我知道基本问题是我在外部应用,所以它可能是通过痛苦的行处理来做行,但我不确定另一种方法可以更快地听到它。有什么想法吗?

4

1 回答 1

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
于 2013-08-25T13:24:59.790 回答