我一直在进行一个查询,该查询将根据到期日和完成任务所需的分钟数返回生产线的建议开始日期。
有一个日程表(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来完成吗,还是应该由游标来处理。或者..。我是不是完全走错了路?
发布于 2010-06-16 19:34:05
像这样的东西可以工作吗?
;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-14 17:51:15
使用公用表表达式计算运行总数是可能的,但速度很慢。这是少数几种游标性能更好的情况之一。
https://stackoverflow.com/questions/3007355
复制相似问题