2013-08-25 71 views
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,那麼我知道我所在的記錄是最後一次。

的基本問題是,這種查詢方式過於緩慢,它運行良好,如果我去針對單個客戶的時間,返回在第二的成績,但運行鍼對〜10萬級的用戶將需要約27個小時。

我知道基本的問題是,我是外應用,所以它是由激動行處理可能做行,但我不知道的另一種方式讓聽到這將更快的工作了。有什麼想法嗎?

回答

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