Это возможно с Sql 2005 CTE? - PullRequest
3 голосов
/ 09 июня 2010

Я работал над запросом, который возвратит предлагаемую дату начала для производственной линии, основанную на дате исполнения и количестве минут, необходимых для выполнения задачи.

Существует таблица календаря (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, или это должно быть обработано курсором.Или ... я просто иду по этому пути совсем не так?

Ответы [ 2 ]

1 голос
/ 16 июня 2010

что-то вроде этой работы?

;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 голос
/ 14 июня 2010

Можно, но медленно, использовать общее табличное выражение для вычисления промежуточного итога. Это один из немногих случаев, когда курсор работает лучше.

...