CTE的替代方案,用于限制运行总计

时间:2012-10-02 20:13:15

标签: ssis common-table-expression

在我进入技术细节之前,我应该解释一下这个场景。我的表格包含特定日期到期的工单。这些工作订单适用于产品托盘,工作订单可包含1个托盘或多个托盘。我需要获得一个工作订单列表,其中托盘的运行总数等于或略大于固定数量(如10个托盘)。由于工作订单无法拆分,如果在多个托盘的工单上达到托盘计数,则应包括工单号。

例如,假设我有10个托盘,其中(按顺序)数量为2,3,1,2,5,1,1,2,3,1。我将返回前5个记录,因为2 + 3 + 1 + 2 + 5 = 13(13是第一个总数等于或大于10)。

对于长篇大论感到抱歉,但我想从数学的角度来理解我的场景。

我创建了这个技术上有效的CTE:

DECLARE @r INT = 10;--Set the limit of number of pallets

WITH CTE
AS (
    SELECT TOP 100 WONumber --Get only a sample of records.
        ,PalletCount
        ,RunningID = ROW_NUMBER() OVER (
            ORDER BY [Sequence Complete Date]
                ,WONumber
            )
    FROM [MyDB].[dbo].[TableName]
    WHERE ShuttleStatus IS NULL --Get pallets not already captured.
    )
SELECT WONumber
    ,PalletCount
FROM CTE AS A
WHERE (
        SELECT SUM(PalletCount)
        FROM CTE
        WHERE RunningID < A.RunningID
        ) < @r --Limit to a specific number of pallets
    OR A.RunningID = 1

然而,它很慢(5-10秒),考虑到该表包含少于1000条记录,我已经在查询中将其限制为100条。

此时,我正在寻找任何有关如何更有效地完成此任务的建议。我有一些SSIS的经验,我愿意在那里做。但是,我不知道如何在不诉诸脚本任务的情况下做到这一点,这有点混乱。

我非常感谢任何建议。谢谢!

0 个答案:

没有答案