2017-04-13 58 views
0

我面臨的問題涉及到計算字段的值,但使用前一行的值。在具有數據使用以前的值計算字段

ID Original Rate  Capital 
-- ------------------ ------- 
1 50      1 
2 50 + 1     1 
3 50 + 1 + 1    1 
4 50 + 1 + 1 + 2   2 
5 50 + 1 + 1 + 2 + 2  2 

表RATE的公式是:原始速率(N)=原始率(n-1)+資本

在原始的,我有1行與原始速率是50,我希望下一個值應該是原始利率+資本。

我也試過使用Lag Function,但它似乎不適用於計算字段。

請幫助我,如果你們對這種情況有什麼想法?

謝謝你的時間!


更新爲新案件:

+----+---------------+------+---------+-------+-------+-------+ 
| ID | Original Rate | Type | Capital | Rate1 | Rate2 | Rate3 | 
+----+---------------+------+---------+-------+-------+-------+ 
| 1 |   50 | 1 |  2 | 0.1 |  |  | 
| 2 |   50 | 1 |  2 | 0.1 |  |  | 
| 3 |   50 | 1 |  2 | 0.1 |  |  | 
| 4 |   50 | 2 |  1 |  | 0.2 |  | 
| 5 |   50 | 3 |  5 |  |  | 0.3 | 
+----+---------------+------+---------+-------+-------+-------+ 

New Rate (n) = New Rate (n-1) + Original Rate * IF(Type=1,Rate1*capital,IF(Type=2,Rate2*capital),Rate3*capital) 

我期待輸出爲如下最後一欄

+----+---------------+------+---------+-------+-------+-------+-----+ 
| ID | Original Rate | Type | Capital | Rate1 | Rate2 | Rate3 |  | 
+----+---------------+------+---------+-------+-------+-------+-----+ 
| 1 |   50 | 1 |  2 | 0.1 |  |  | 10 | 
| 2 |   50 | 1 |  2 | 0.1 |  |  | 20 | 
| 3 |   50 | 1 |  2 | 0.1 |  |  | 30 | 
| 4 |   50 | 2 |  4 |  | 0.2 |  | 70 | 
| 5 |   50 | 3 |  5 |  |  | 0.3 | 145 | 
+----+---------------+------+---------+-------+-------+-------+-----+ 

任何意見和建議,歡迎!

[更新17-APR-2017] 我實現了使用遞歸遞歸的萃取

WITH RATE_MASTER AS (ID, RATE) 
(
    SELECT 1, ORIGINALRATE FROM RATE WHERE ID = 1 

    UNION ALL 

    SELECT ID, 
    CASE 
     WHEN TYPE = 1 THEN RATE + Rate1*Capital 
     WHEN TYPE = 2 THEN RATE + Rate2*Capital 
     WHEN TYPE = 3 THEN RATE + Rate3*Capital 
    END AS RATE 

    FROM RATE, RATE_MASTER 
    WHERE RATE_MASTER.ID = RATE.ID - 1 
) 
SELECT * FROM RATE_MASTER; 

一切正常!

[關閉]

+1

請將一些示例數據和預期結果以表格格式作爲格式化文本。 –

+0

你可以請點擊運行代碼片段?我還更新了一個包含數據的表格。 – Hana

回答

0

甲骨文設置

CREATE TABLE rate (id, capital) AS 
    SELECT 1, 1 FROM DUAL UNION ALL 
    SELECT 2, 1 FROM DUAL UNION ALL 
    SELECT 3, 1 FROM DUAL UNION ALL 
    SELECT 4, 2 FROM DUAL UNION ALL 
    SELECT 5, 2 FROM DUAL; 

查詢

SELECT id, 
     50 + SUM(capital) OVER (ORDER BY id) 
      - FIRST_VALUE(capital) OVER (ORDER BY id) AS rate, 
     capital 
FROM rate; 

輸出

ID RATE CAPITAL 
-- ---- ------- 
1 50  1 
2 51  1 
3 52  1 
4 54  2 
5 56  2 
+0

感謝MT0,它處理示例數據。我即將申請我的案件,並很快回來! – Hana