首页 > 解决方案 > 在不同行的两个日期之间生成 SQL

问题描述

我正在根据两个日期之间的天数(逐天)生成线条。我会在第一行有第一个日期,在第二行有第二个日期,但这一切都取决于身份证和钱。我认为最好举个例子:

原产地表:

在此处输入图像描述

我的目标:

在此处输入图像描述

可以循环吗?

非常感谢。

标签: sqloracle

解决方案


您可以使用递归子查询因式分解子句:

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<>在这里摆弄


推荐阅读