检查行中句点之间是否有间隙

问题描述 投票:0回答:1

我可以知道如何检查sql中后续行之间是否有间隙吗? 我的桌子是这样的

无间隙:

| Start Date | End Date|
 ------------ ---------
| 06/FEB/23  |16/APR/23|
| 30/JAN/23  |05/FEB/23|
| 01/JAN/23  |29/JAN/23|

(23 年 2 月 5 日和 23 年 3 月 7 日)之间存在差距:

| Start Date | End Date|
 ------------ ---------
| 07/MAR/23  |16/APR/23|
| 30/JAN/23  |05/FEB/23|
| 01/JAN/23  |29/JAN/23|

谢谢。

sql oracle oracle-sqldeveloper
1个回答
0
投票

一个选择是使用

lead
分析函数,以便您可以将下一行的
start_date
与本行的
end_date + 1
进行比较;如果它们匹配,则没有间隙。

样本数据:

SQL> with test (id, start_date, end_date) as
  2    (select 1, date '2023-02-06', date '2023-04-16' from dual union all
  3     select 1, date '2023-01-30', date '2023-02-05' from dual union all
  4     select 1, date '2023-01-01', date '2023-01-29' from dual union all
  5     --
  6     select 2, date '2023-03-07', date '2023-04-16' from dual union all
  7     select 2, date '2023-01-30', date '2023-02-05' from dual union all
  8     select 2, date '2023-01-01', date '2023-01-29' from dual
  9    )

查询:

 10  select id,
 11    start_date,
 12    case when end_date + 1 <> lead(start_date) over (partition by id order by start_date) then 'gap'
 13         else 'no gap'
 14    end result
 15  from test
 16  order by id, start_date desc;

        ID START_DATE RESULT
---------- ---------- ------
         1 06/02/2023 no gap
         1 30/01/2023 no gap
         1 01/01/2023 no gap
         2 07/03/2023 no gap
         2 30/01/2023 gap
         2 01/01/2023 no gap

6 rows selected.

SQL>

如果您需要知道哪个

ID
包含间隙,请将查询扩展到

 10  temp as
 11    (select id,
 12       start_date,
 13       case when end_date + 1 <> lead(start_date) over (partition by id order by start_date) then 'gap'
 14            else 'no gap'
 15       end result
 16     from test
 17    )
 18  select id, min(result) result
 19  from temp
 20  group by id
 21  order by id;

        ID RESULT
---------- ------
         1 no gap
         2 gap

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.