1

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

例如,假设我有 10 个托盘,其中(按顺序)数量为 2、3、1、2、5、1、1、2、3、1。我将返回自 2+3+1+2+5=13 以来的前 5 条记录(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

但是,考虑到该表包含的记录少于 1000 条,并且我已经在查询中将其限制为 100 条,它非常慢(5-10 秒)。

在这一点上,我正在寻找如何更有效地完成此任务的任何建议。我在 SSIS 有一些经验,我愿意在那里做。但是,如果不求助于脚本任务,我无法弄清楚如何做到这一点,这有点混乱。

我将不胜感激任何建议。谢谢!

4

0 回答 0