在我进入技术细节之前,我应该解释一下这个场景。我有一个表格,其中包含在特定日期到期的工作订单列表。这些工作订单用于产品托盘,一个工作订单可以包含 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 有一些经验,我愿意在那里做。但是,如果不求助于脚本任务,我无法弄清楚如何做到这一点,这有点混乱。
我将不胜感激任何建议。谢谢!