我可以知道如何检查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|
谢谢。
一个选择是使用
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>