資料:
| ID | 日期 | 數量 |
|---|---|---|
| 1 | 29.12.2020 | 6 |
| 1 | 05.01.2021 | 5 |
| 1 | 15.02.2021 | 7 |
| 2 | 11.04.2021 | 9 |
| 2 | 27.05.2021 | 8 |
| 2 | 29.05.2021 | 7 |
期望的輸出:
| ID | 日期 | 數量 |
|---|---|---|
| 1 | 01.12.2020 | 0 |
| . | . | . |
| . | . | . |
| 1 | 28.12.2020 | 0 |
| 1 | 29.12.2020 | 6 |
| . | . | . |
| . | . | . |
| 1 | 04.01.2020 | 6 |
| 1 | 05.01.2021 | 5 |
| . | . | . |
| . | . | . |
| 1 | 14.02.2021 | 5 |
| 1 | 15.02.2021 | 7 |
| . | . | . |
| . | . | . |
| 1 | 28.02.2021 | 7 |
| 2 | 01.04.2021 | 0 |
| . | . | . |
| . | . | . |
| 2 | 10.04.2021 | 0 |
| 2 | 11.04.2021 | 9 |
| . | . | . |
| . | . | . |
| 2 | 26.05.2021 | 9 |
| 2 | 27.05.2021 | 8 |
| 2 | 28.05.2021 | 8 |
| 2 | 29.05.2021 | 7 |
所以,基本上,我想擴展缺失日期的資料集,并為每個新添加的日期插入最新的先前金額值(最后一段中提到的例外)。
事實上,下面的鏈接解決了這個問題:
如何通過更改計數值在 Oracle 中按組填充缺少的日期
但是,與上面的帖子不同,ID 組的日期范圍不是預先確定的。
另外,對于與第一次觀察相關的月份中未觀察到的值,填充值應為 0(例如,金額列在 01.12.2020 和 28.12.2020 之間取值為 0,因為 2020 年第十二個月的第一次觀察是在第 29 天) )。
uj5u.com熱心網友回復:
您可以使用遞回查詢來生成日期:
SELECT d.id,
d.dt AS "DATE",
COALESCE(
LAST_VALUE(t.amount)
IGNORE NULLS OVER (PARTITION BY d.id ORDER BY d.dt),
0
) AS amount
FROM table_name t
RIGHT OUTER JOIN (
WITH date_ranges (id, dt, max_dt) AS (
SELECT id,
TRUNC(MIN("DATE"), 'MM'),
LAST_DAY(TRUNC(MAX("DATE"), 'MM'))
FROM table_name
GROUP BY id
UNION ALL
SELECT id, dt 1, max_dt
FROM date_ranges
WHERE dt < max_dt
)
SELECT id, dt
FROM date_ranges
) d
ON (t.id = d.id AND t."DATE" = d.dt)
ORDER BY id, "DATE"
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356379.html
