oracle 基于条件SQL标记通过或失败

0pizxfdo  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(101)

输入:
表1
| ID|类别|
| --|--|
| 1 |螺柱|
| 2 |螺柱|
| 3 |螺柱|
表2
| ID|日期|
| --|--|
| 1 |2023年9月30日|
| 1 |2019 -09- 29 2019 -09- 29 2019 -09 - 29|
| 2 |2019 -09- 29 2019 -09- 29 2019 -09 - 29|
| 2 |2023年9月28日|
| 3 |2019 -08- 21 10:00:00|
输出
| ID|日期|结果|
| --|--|--|
| 1 |2023年9月30日|通过|
| 2 |2019 -09- 29 2019 -09- 29 2019 -09 - 29|通过|
| 3 |2019 -08- 21 10:00:00|失败|
这里的目标是创建基于2个输入表的输出表,这里的逻辑是,我试图获取每个id的每个月的最后一条记录,分别给出id和date列,因为id 2没有最后一天,也就是9月30日,我选择给定数据中的最后一天。
如果一个id在过去的10天内有一个条目,则下一个result列被框定为pass,否则学生的结果是fail,例如,id 3在过去的10天内没有日期条目,因此result是fail,而其他两个id的结果是pass

xmd2e60i

xmd2e60i1#

您可以用途:

SELECT t1.id,
       t2.date_column,
       CASE
       WHEN t2.date_column >= TRUNC(SYSDATE) - INTERVAL '10' DAY
       THEN 'pass'
       ELSE 'fail'
       END AS result
FROM   table1 t1
       LEFT OUTER JOIN (
         SELECT id,
                date_column,
                ROW_NUMBER() OVER (
                  PARTITION BY id, TRUNC(date_column, 'MM')
                  ORDER BY date_column DESC
                ) AS rn
         FROM   table2
       ) 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;

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

xghobddn

xghobddn2#

看起来第一个表是无关紧要的,因为你没有从中选择任何东西。如果你确实需要它(因为不是所有的ID在第二个表中都有匹配的行),可以将它与第二个表的外部联接一起使用。
根据预期结果,今天是2023年10月11日,因此没有行 * 通过 *,因为从所有涉及的日期起已经超过10天。这就是为什么我将限制设置为15天(第10行)。
样本数据:

SQL> with t2 (id, datum) as
  2    (select 1, date '2023-09-30' from dual union all
  3     select 1, date '2023-09-29' from dual union all
  4     select 2, date '2023-09-29' from dual union all
  5     select 2, date '2023-09-28' from dual union all
  6     select 3, date '2023-08-15' from dual
  7    )

查询方式:

8  select id,
  9    max(datum) datum,
 10    case when trunc(sysdate) - max(datum) <= 15 then 'pass'
 11         else 'fail'
 12    end as result
 13  from t2
 14  group by id;

        ID DATUM      RESULT
---------- ---------- -------
         1 30-09-2023 pass
         2 29-09-2023 pass
         3 15-08-2023 fail

SQL>

如果涉及到其他列(根据您发布的评论,似乎是这样,但没有修改示例数据),那么一个选择是使用分析函数(如row_numberrank),按ID和月份按降序对行进行 * 排序 *,然后获取排名最高的行。
大概是这样的:

SQL> WITH
  2     t2 (id, datum, col)
  3     AS
  4        (SELECT 1, DATE '2023-09-30', 'A' FROM DUAL
  5         UNION ALL
  6         SELECT 1, DATE '2023-09-29', 'B' FROM DUAL
  7         UNION ALL
  8         SELECT 1, DATE '2023-08-15', 'C' FROM DUAL
  9         UNION ALL
 10         SELECT 1, DATE '2023-06-13', 'D' FROM DUAL
 11         UNION ALL
 12         SELECT 1, DATE '2023-06-08', 'E' FROM DUAL
 13         UNION ALL
 14         SELECT 1, DATE '2023-06-02', 'F' FROM DUAL
 15         UNION ALL
 16         SELECT 2, DATE '2023-09-29', 'A' FROM DUAL
 17         UNION ALL
 18         SELECT 2, DATE '2023-09-28', 'B' FROM DUAL
 19         UNION ALL
 20         SELECT 3, DATE '2023-08-15', 'A' FROM DUAL),

查询方式:

21     temp
 22     AS
 23        (SELECT id,
 24                datum,
 25                col,
 26                ROW_NUMBER ()
 27                   OVER (PARTITION BY id, TO_CHAR (datum, 'yyyymm') ORDER BY datum DESC) rn
 28           FROM t2)
 29    SELECT id, datum, col
 30      FROM temp
 31     WHERE rn = 1
 32  ORDER BY id, datum DESC;

        ID DATUM      C
---------- ---------- -
         1 30-09-2023 A
         1 15-08-2023 C
         1 13-06-2023 D
         2 29-09-2023 A
         3 15-08-2023 A

SQL>

相关问题