在我进入技术细节之前,我应该解释一下这个场景。我的表格包含特定日期到期的工单。这些工作订单适用于产品托盘,工作订单可包含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的经验,我愿意在那里做。但是,我不知道如何在不诉诸脚本任务的情况下做到这一点,这有点混乱。
我非常感谢任何建议。谢谢!