[英]How calculate previous cumulative product in SQL (detail below)
我正在嘗試使用 SQL 估算生產線中的新報廢率(損失系數)。
基本上,一台機器有多個操作,每個操作都有 qty in 和 quty out。
以下操作具有前一個操作的數量,作為 qty in。
而這個報廢率(損耗因子)需要結轉操作。
因此,操作 1 將有來自操作 1 的輸出數量/輸入數量 = 報廢率 1; 操作 2 的出貨量/進貨量 * 報廢率 1; 等等。
我知道我可以使用“exp(sum(log(column)) OVER (ORDER BY column))”來獲得整體,比如說機器報廢率,但我需要每個機器操作級別的累積值。
希望所附圖片可以更好地解釋結果。
我正在努力計算圖像中的 G 列(OutFactorAccumulated)。 希望可以有人幫幫我。
謝謝,
計算累計積
我認為你大部分時間都在那里。
最后一步是簡單地獲取 OutfactorAccumulated 列,並對其執行類似的窗口函數以計算下一列,例如MIN(OutFactorAccumulated) OVER (PARTITION BY Machine)
。
另請注意,另一個窗口函數(SUM)也應該在窗口中有一個PARTITION BY Machine
,以確保每台機器只使用自己的數據。
這是一個db<>fiddle ,其中包含 SQL Server/T-SQL 中的示例代碼。
(請注意很多 CAST AS decimal(14,10) 以匹配您的數據 - 可能有更好的方法來執行此操作)。
CREATE TABLE #MachData (Machine nvarchar(10), Operation int, QtyIn int, QtyOut int, PRIMARY KEY (Machine, Operation));
INSERT INTO #MachData (Machine, Operation, QtyIn, QtyOut) VALUES
(N'A1', 1, 100, 100),
(N'A1', 2, 100, 95),
(N'A1', 3, 95, 95),
(N'A1', 4, 95, 94),
(N'A1', 5, 94, 86),
(N'A1', 6, 86, 66),
(N'A1', 7, 66, 66),
(N'A1', 8, 66, 66),
(N'A1', 9, 66, 66);
WITH MachData_with_Factors AS
(SELECT Machine,
Operation,
QtyIn,
QtyOut,
CAST(1 - CAST(QtyOut AS decimal(14,10))/CAST(QtyIn AS decimal(14,10)) AS decimal(14,10)) AS LossFactor,
CAST(CAST(QtyOut AS decimal(14,10))/CAST(QtyIn AS decimal(14,10)) AS decimal(14,10)) AS OutFactor
FROM #MachData
),
MachineData_with_Acc AS
(SELECT *,
CAST(exp(SUM(log(OutFactor)) OVER (PARTITION BY Machine ORDER BY Operation)) AS decimal(14,10)) AS OutFactorAccumulated
FROM MachData_with_Factors
),
MachineData_with_ExpQtyOut AS
(SELECT *,
CAST(OutFactorAccumulated * 100.0 / MIN(OutFactorAccumulated) OVER (PARTITION BY machine) AS decimal(14,10)) AS NewExpectedQtyOut
FROM MachineData_with_Acc
)
SELECT *
FROM MachineData_with_ExpQtyOut
ORDER BY Machine, Operation;
結果如下
Machine Operation QtyIn QtyOut LossFactor OutFactor OutFactorAccumulated NewExpectedQtyOut
------------------------------- ---------------------------------------------------------------------------
A1 1 100 100 0.0000000000 1.0000000000 1.0000000000 151.5151515152
A1 2 100 95 0.0500000000 0.9500000000 0.9500000000 143.9393939394
A1 3 95 95 0.0000000000 1.0000000000 0.9500000000 143.9393939394
A1 4 95 94 0.0105263158 0.9894736842 0.9400000000 142.4242424242
A1 5 94 86 0.0851063830 0.9148936170 0.8600000000 130.3030303030
A1 6 86 66 0.2325581395 0.7674418605 0.6600000000 100.0000000000
A1 7 66 66 0.0000000000 1.0000000000 0.6600000000 100.0000000000
A1 8 66 66 0.0000000000 1.0000000000 0.6600000000 100.0000000000
A1 9 66 66 0.0000000000 1.0000000000 0.6600000000 100.0000000000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.