2010-06-09 68 views
3

我一直在處理一個查詢,該查詢將根據截止日期和完成任務所需的分鐘數返回製造線的建議開始日期。Sql 2005 CTE有可能嗎?

有一個日曆表(LINE_ID,CALENDAR_DATE,SCHEDULED_MINUTES)顯示每個生產線,計劃當天的分鐘數。

例子:(一般是3班值得的時間,每天安排,沒有周末,但可能有所不同)

1, 06/8/2010 00:00:00.000, 1440 
1, 06/7/2010 00:00:00.000, 1440 
1, 06/6/2010 00:00:00.000, 0 
1, 06/5/2010 00:00:00.000, 0 
1, 06/4/2010 00:00:00.000, 1440 

爲了得到建議的開始日期,我要開始與截止日期和迭代直到我累積足夠的時間來完成任務。

我的問題可以用CTE完成,或者這是應該由遊標處理的東西。或者...我只是完全用錯誤的方式去做?

+0

一些相關鏈接http://stackoverflow.com/questions/1153879/how-do-i-calculate-a-running-total-in-sql-without-using-a-cursor http:// www。 jasinskionline.com/TechnicalWiki/RunningTotal.ashx。 – 2010-06-09 17:08:51

回答

1

會是這樣的工作?

;WITH CALENDAR_WITH_INDEX(CALENDAR_DATE, AVAILABLE_MINUTES, DATE_INDEX) 
(
    SELECT 
      CALENDAR_DATE, 
      1440 - SCHEDULED_MINUTES,    /* convert scheduled minutes to available minutes */ 
      ROW_NUMBER() OVER (ORDER BY CALENDAR_DATE DESC) /* get day indexes. can't use DATE functions to get previous day (think holidays) */ 
    FROM 
      CALENDAR 
    WHERE 
      LINE_ID = @LINE_ID AND 
      CALENDAR_DATE < @DUEDATE      /* use <= instead of < if you can do stuff on the scheduled date too */ 
), 
WITH TIME_SLICES (SCHEDULED_DATE, MINUTESPENDING, SLICE_INDEX) 
(
    SELECT 
      CALENDAR_DATE, 
      @DURATION - (AVAILABLE_MINUTES),    /* knocks of minutes available from our running total */ 
      DATE_INDEX 
    FROM 
      CALENDAR_WITH_INDEX        
    WHERE 
      DATE_INDEX = 1         /* gets the first date usable date */ 

    UNION ALL 

    SELECT 
      CALENDAR_DATE, 
      MINUTESPENDING - AVAILABLE_MINUTES 
      DATE_INDEX 
    FROM 
      CALENDAR_WITH_INDEX 
      INNER JOIN TIME_SLICES 
       ON DATE_INDEX = SLICE_INDEX + 1   /* this gets us the date 1 day before */ 
    WHERE 
      MINUTESPENDING > 0        /* stop when we have no more minutes */ 
) 
SELECT MIN(SCHEDULED_DATE) FROM TIME_SLICES 

我想性能會因爲row_number遞歸部分而變差。

1

使用公用表表達式計算運行總數可能會很慢。這是少數情況下游標執行更好的情況之一。

相關問題