3

私は、期日とタスクを完了するのに必要な分数に基づいて、製造ラインの推奨開始日を返すクエリに取り組んでいます。

製造ラインごとに、その日に予定されている分数を表示するカレンダー テーブル (LINE_ID、CALENDAR_DATE、SCHEDULED_MINUTES) があります。

例: (通常、1 日あたり 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でこのようなことを行うことができますか、それともカーソルで処理する必要がありますか? それとも...私はこれについて完全に間違った方法で進んでいますか??

4

2 に答える 2

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の再帰部分が原因で、パフォーマンスが低下すると思います。

于 2010-06-16T11:34:04.983 に答える
1

共通テーブル式を使用して現在の合計を計算することは可能ですが、時間がかかります。これは、カーソルのパフォーマンスが向上する数少ないケースの 1 つです。

于 2010-06-14T09:51:15.317 に答える