簡體   English   中英

根據 Oracle SQL 中的前一行值計算行值

[英]Calculate row value based on previous row values in Oracle SQL

我對最終降價的識別有疑問。 我有幾年和每年的折扣。 所以,我需要找出去年的最終價格是多少。 如果在一年內我有折扣,那么我也需要下一年的折扣價,而不是原價。 正如所附屏幕截圖所示,您可以看到在 2022 年和 2023 年我有 5% 的折扣,但在這兩年它的結果是相同的,因為從原價降低了 5%,盡管在 2023 年它必須降低 5 2022年已經降價的%。2024年我有0%的折扣,所以我需要2024年的2023年的價值。2025年我有2%的折扣,所以應該從2024年的價值減少。這里是代碼:

select k.object_number, k.plant, k.company, k.discount, k.demand, k.year, k.Price, 
      case when (k.discount) is null then k.price else k.price * (100-k.discount)/100 end as Reduced_price    
from K_TABLE as K
order by k.year`

實際結果樣本:

Object Number     Plant      Company     Demand   Year     Discount   Price     Reduced Price
    1A                30          ABC         790      2021     0          45,88     45,88           1A                30          ABC         17587    2022     5          45,88     43,586       1A                21          ABC         7824     2022     5          45,88     43,586           1A                63          ABC         12038    2023     5          45,88     43,586         1A                30          ABC         21039    2023     5          45,88     43,586        1A                30          ABC         24299    2024     0          45,88     45,88         1A                37          ABC         17257    2024     0          45,88     45,88          1A                83          ABC         3060     2025     2          45,88     44,9624       1A                21          ABC         49647    2025     2          45,88     44,9624      1A                30          ABC         19904    2026     0          45,88     45,88                                       

請檢查隨附的屏幕截圖以獲取完整結果。`

在此處輸入圖像描述

您可以使用算術計算總折扣——即對數和指數:

select k.*,
       (1 - exp(sum(ln(1 - discount / 100)) over (partition by object_number, plant, company order by year)
       ) as total_discount,
       (price *
        exp(sum(ln(1 - coalesce(discount, 0) / 100)) over (partition by object_number, plant, company order by year)
       ) as reduced_price
from K_TABLE as K
order by k.year;

exp(sum(ln(. . . )))表達式正在做一個累積乘積。 這不是 SQL 內置的,但它可以使用數學運算進行計算。

注意:很難說出您的數據中的“單位”是什么——也就是說,什么構成了同一單位的“下一個”行。 我假設它是 object、工廠和公司的組合。 但是,我希望像“產品”列這樣的信息在單個列中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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