sql - 在不同行的两个日期之间生成 SQL
问题描述
我正在根据两个日期之间的天数(逐天)生成线条。我会在第一行有第一个日期,在第二行有第二个日期,但这一切都取决于身份证和钱。我认为最好举个例子:
原产地表:
我的目标:
可以循环吗?
非常感谢。
解决方案
您可以使用递归子查询因式分解子句:
WITH dt_range ( id, dt, next_dt, money ) AS (
SELECT id,
dt,
LEAD(dt) OVER (PARTITION BY id ORDER BY dt),
money
FROM table_name
UNION ALL
SELECT id,
dt + INTERVAL '1' DAY,
next_dt,
money
FROM dt_range
WHERE dt + INTERVAL '1' DAY < next_dt
)
SEARCH DEPTH FIRST BY dt SET dt_order
SELECT id, dt, money FROM dt_range;
其中,对于您的示例数据:
CREATE TABLE table_name ( id, dt, money ) AS
SELECT 500, DATE '2017-02-23', 3500 FROM DUAL UNION ALL
SELECT 500, DATE '2017-02-26', 35000 FROM DUAL UNION ALL
SELECT 500, DATE '2017-02-28', 50000 FROM DUAL UNION ALL
SELECT 200, DATE '2020-05-01', 8888 FROM DUAL UNION ALL
SELECT 200, DATE '2020-05-05', 999 FROM DUAL UNION ALL
SELECT 200, DATE '2020-05-09', 1000 FROM DUAL;
输出:
ID DT 钱 500 17 年 2 月 23 日 3500 500 17 年 2 月 24 日 3500 500 17 年 2 月 25 日 3500 500 17 年 2 月 26 日 35000 500 27-2-17 35000 500 17 年 2 月 28 日 50000 200 20 年 5 月 1 日 8888 200 20 年 5 月 2 日 8888 200 20 年 5 月 3 日 8888 200 20 年 5 月 4 日 8888 200 20 年 5 月 5 日 999 200 20 年 5 月 6 日 999 200 20 年 5 月 7 日 999 200 20 年 5 月 8 日 999 200 20 年 5 月 9 日 1000
db<>在这里摆弄
如果您使用的是 Oracle 11g,那么它会出现迭代日期的错误;这可以通过迭代一个数字然后将其添加到日期(而不是直接在日期上迭代)来轻松解决:
WITH dt_range ( id, dt, offset, next_dt, money ) AS (
SELECT id,
dt,
0,
LEAD(dt) OVER (PARTITION BY id ORDER BY dt),
money
FROM table_name
UNION ALL
SELECT id,
dt,
offset + 1,
next_dt,
money
FROM dt_range
WHERE dt + offset + 1 < next_dt
)
SEARCH DEPTH FIRST BY dt SET dt_order
SELECT id, dt + offset AS dt, money FROM dt_range;
db<>在这里摆弄
推荐阅读
- reactjs - 如何让es6编写的npm模块在打开声明时指向源码
- python - 如何从 html 文档中检索没有“img”作为标签的图像?
- flutter - Flutter 小部件对齐
- java - 如何使 charAt 方法与 java 中的数组一起使用?
- google-cloud-platform - 无法在谷歌数据实验室运行 pmdarima。它给出一个错误 .ufunc 大小改变,
- r - 数据框中的非英文字母
- python - 找到满足条件的连续元素 pandas
- c# - ASP NET Core WebSocket 接受延迟
- events - Spring集成事件的Spring集成顺序
- javascript - (javascript) JSON.parse() 改变 json 的内容