[英]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.