我在 SQLite 中有一個視圖,其中兩列需要遵循遞回公式。示例輸入資料如下:
| 日期 | 鈣 | CB | 抄送 |
|---|---|---|---|
| 2020-01-01 | 無效的 | 無效的 | 100.0 |
| 2020-01-02 | 0.1 | 無效的 | 無效的 |
| 2020-01-03 | 0.2 | 無效的 | 無效的 |
| 2020-01-04 | 0.1 | 無效的 | 無效的 |
| 2020-01-05 | 0.4 | 無效的 | 無效的 |
| 2020-01-06 | 0.3 | 無效的 | 無效的 |
| 2020-01-07 | 0.2 | 無效的 | 無效的 |
| 2020-01-08 | 0.4 | 無效的 | 無效的 |
CREATE TABLE "Test" (
"Date" DATE,
"Ca" NUMERIC,
"Cb" NUMERIC,
"Cc" NUMERIC
);
INSERT INTO Test (Date, Ca, Cb, Cc)
VALUES ( '2020-01-01', NULL, NULL, 100.0),
( '2020-01-02', 0.1, NULL, NULL),
( '2020-01-03', 0.2 , NULL, NULL),
( '2020-01-04', 0.1 , NULL, NULL),
( '2020-01-05', 0.4 , NULL, NULL),
( '2020-01-06', 0.3 , NULL, NULL),
( '2020-01-07', 0.2 , NULL, NULL),
( '2020-01-08', 0.4 , NULL, NULL)
;
要求列 [Cb] 和 [Cc] 是遞回的,這樣(在粗略的 SQL 邏輯中):
- [Cb] = LAG([Cc]) * [Ca]
- [Cc] = LAG([Cc]) [Cb]
因此,[Cb] 列中的第二個單元格將等于 10 或 100 * 0.1,而 [Cc] 列中的第二個單元格將等于 110 或 100 10。
對于此示例,完整的解決方案如下所示:
| 日期 | 鈣 | CB | 抄送 |
|---|---|---|---|
| 2020-01-01 | 無效的 | 無效的 | 100.0 |
| 2020-01-02 | 0.1 | 10.0 | 110.0 |
| 2020-01-03 | 0.2 | 22.0 | 132.0 |
| 2020-01-04 | 0.1 | 13.2 | 145.2 |
| 2020-01-05 | 0.4 | 58.1 | 203.3 |
| 2020-01-06 | 0.3 | 61.0 | 264.3 |
| 2020-01-07 | 0.2 | 52.9 | 317.1 |
| 2020-01-08 | 0.4 | 126.8 | 444.0 |
表的長度是動態的,因此遞回解決方案也必須是動態的。
我已經通讀并探索了 SQLite 的遞回 CTE 功能,但我似乎無法弄清楚如何在視圖的背景關系中應用它。或者我可能應該以不同的方式處理這個問題。任何幫助或指導將不勝感激。
uj5u.com熱心網友回復:
在這種情況下,視圖和表之間沒有區別。首先,我添加 row_number,以便直接選擇 rCTE 中的下一行。然后你可以計算你的目標:
WITH RECURSIVE
numbered AS (
SELECT row_number() OVER (ORDER BY "Date") AS idx, * FROM Test
),
new_test AS (
SELECT * FROM numbered WHERE idx = 1
UNION ALL
SELECT
numbered.idx,
numbered."Date",
numbered.Ca,
new_test.Cc * numbered.Ca AS Cb,
new_test.Cc new_test.Cc * numbered.Ca AS Cc
FROM new_test, numbered
WHERE numbered.idx = new_test.idx 1
)
SELECT "Date", Ca, round(Cb, 1) AS Cb, round(Cc, 1) AS Cc FROM new_test
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/524038.html
上一篇:鏈表遞回值和
