技術的な詳細に入る前に、シナリオについて説明する必要があります。特定の日付が期限の作業指示書のリストを含むテーブルがあります。これらの作業指示書は製品のパレット用であり、作業指示書には 1 つのパレットまたは複数のパレットを含めることができます。パレットの現在の合計が固定数 (10 パレットなど) と等しいか、それよりわずかに大きい作業指示書のリストを取得する必要があります。作業オーダーは分割できないため、複数パレットの作業オーダーでパレット数に達した場合は、作業オーダー番号を含める必要があります。
たとえば、(順番に) 数量が 2、3、1、2、5、1、1、2、3、1 の 10 個のパレットがあるとします。2+3+1+2+5=13 (13 は 10 以上の最初の合計) であるため、最初の 5 レコードを返します。
長い宣伝文で申し訳ありませんが、数学の観点からシナリオを明確にしたかったのです。
技術的に機能するこの 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 である程度の経験があり、そこでやりたいと思っています。ただし、スクリプト タスクに頼らずにこれを行う方法を理解することはできません。
提案をいただければ幸いです。ありがとうございました!