oracle 每月录入跟踪

amrnrhlw  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(112)

这里的目的是根据3个输入表创建输出表,逻辑是为每个id获取每个月的最后一条记录,每个id分别给出id和日期(日期列将从表2而不是表3中提取),因为id 2没有月份的最后一天,即6月30日,我选择给定数据中可用的最后一天。
这个问题与一个老问题类似,所以我在这里提到两个问题之间的区别:如果“id”在表2或表3中的该日期(而不是当前系统日期)的过去30天内至少有一次日期条目,则“result”列的框架为“pass”,否则学生的结果为fail。
输入:
表1
| ID|类别|
| --|--|
| 1 |螺柱|
| 2 |螺柱|
| 3 |螺柱|
表2
| ID|日期|
| --|--|
| 1 |2023年9月30日|
| 1 |2019 -09- 29 2019 -09- 29 2019 -09 - 29|
| 2 |2023年6月25日|
| 3 |2019 -08- 21 10:00:00|
表3:
| ID|日期|
| --|--|
| 1 |2023年9月30日|
| 1 |2019 -09- 29 2019 -09- 29 2019 -09 - 29|
| 1 |2019 -08- 29 2019 -08- 29|
| 2 |2023年5月29日|
| 3 |2019 -07- 22 2019 - 07 - 22|
输出
| ID|日期|结果|
| --|--|--|
| 1 |2023年9月30日|通过|
| 1 |2019 -08- 29 2019 -08- 29|失败|
| 2 |2019 -06- 21 2019 -06 - 21|通过|
| 2 |2023年5月29日|失败|
| 3 |2019 -08- 21 10:00:00|通过|
| 3 |2019 -07- 22 2019 - 07 - 22|失败|
输出中结果列的说明:
9月的id 1是“通过”,因为它在9月30日之后的30天内在表2或表3中有一个日期条目
八月的id 1是“失败”,因为它在表1和表2中没有从八月29日起的过去30天内的日期条目
6月的id 2是“pass”,因为它在表3中有一个过去30天的日期条目,而5月的id 2是“failed”,依此类推

ttygqcqt

ttygqcqt1#

这实际上与your previous question相同,但使用LAG/LEAD分析函数来查找前一个日期,而不是使用SYSDATE

SELECT t1.id,
       t2.date_column,
       CASE
       WHEN t2.date_column <= prev_date + INTERVAL '30' DAY
       THEN 'pass'
       ELSE 'fail'
       END AS result
FROM   table1 t1
       LEFT OUTER JOIN (
         SELECT id,
                date_column,
                LEAD(date_column) OVER (
                  PARTITION BY id ORDER BY date_column DESC
                ) As prev_date,
                ROW_NUMBER() OVER (
                  PARTITION BY id, TRUNC(date_column, 'MM')
                  ORDER BY date_column DESC
                ) AS rn
         FROM   (
           SELECT *
           FROM   table2
         UNION ALL
           SELECT *
           FROM   table3
         )
       ) t2
       ON (t1.id = t2.id AND t2.rn = 1)

其中,对于样本数据:

CREATE TABLE table1 (id) AS
SELECT 1 FROM DUAL UNION ALL
SELECT 2 FROM DUAL UNION ALL
SELECT 3 FROM DUAL;

CREATE TABLE table2 (id, date_column) AS
SELECT 1, TRUNC(SYSDATE) -  9 FROM DUAL UNION ALL
SELECT 1, TRUNC(SYSDATE) - 10 FROM DUAL UNION ALL
SELECT 2, TRUNC(SYSDATE) - 10 FROM DUAL UNION ALL
SELECT 2, TRUNC(SYSDATE) - 11 FROM DUAL UNION ALL
SELECT 3, TRUNC(SYSDATE) - 20 FROM DUAL UNION ALL
SELECT 3, TRUNC(SYSDATE) - 52 FROM DUAL;

CREATE TABLE table3 (id, date_column) AS
SELECT 1, TRUNC(SYSDATE) -  9 FROM DUAL UNION ALL
SELECT 1, TRUNC(SYSDATE) - 10 FROM DUAL UNION ALL
SELECT 2, TRUNC(SYSDATE) - 10 FROM DUAL UNION ALL
SELECT 2, TRUNC(SYSDATE) - 11 FROM DUAL UNION ALL
SELECT 3, TRUNC(SYSDATE) - 18 FROM DUAL;

输出:
| ID|日期_列|结果|
| --|--|--|
| 1 |2019 -04 - 22 00:00:00|通过|
| 2 |2019 -03 - 12 00:00:00|通过|
| 3 |2019 -08-22 00:00:00|失败|
| 3 |2023-09-25 00:00:00|通过|
fiddle

相关问题