簡體   English   中英

SQL中如何計算之前的累計乘積(詳見下文)

[英]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 中的示例代碼。

  • 最后一個 CTE“MachineData_with_ExpQtyOut”是具有 Windows MIN 函數來進行計算的 CTE。
  • 在 Fiddle 中,我還添加了第二台機器 B1,其中包含我編寫的一些數據 - 以證明它適用於多台機器。

(請注意很多 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM