你可以使用MATCH_RECOGNIZE:
SELECT *
FROM table_name
MATCH_RECOGNIZE (
PARTITION BY id
ORDER BY start_date
MEASURES FIRST( start_date ) AS start_date,
MAX( end_date ) AS end_date,
FIRST( present ) AS present,
FIRST( absent ) AS absent
ONE ROW PER MATCH
PATTERN (FIRST_ROW EQUAL_ROWS*)
DEFINE EQUAL_ROWS AS
(
(
(
EQUAL_ROWS.present = PREV(EQUAL_ROWS.present)
) OR (
EQUAL_ROWS.present IS NULL AND PREV(EQUAL_ROWS.present) IS NULL
)
) AND (
(
EQUAL_ROWS.absent = PREV(EQUAL_ROWS.absent)
) OR (
EQUAL_ROWS.absent IS NULL AND PREV(EQUAL_ROWS.absent) IS NULL
)
)
)
)
因此,对于您的示例数据:
CREATE TABLE table_name ( id, start_date, end_date, present, absent ) AS
SELECT 1, DATE '2020-02-01', DATE '2020-03-01', 'Y', 'N' FROM DUAL UNION ALL
SELECT 1, DATE '2020-03-04', DATE '2020-04-19', 'Y', 'N' FROM DUAL UNION ALL
SELECT 1, DATE '2020-03-06', DATE '2020-03-09', 'N', 'N' FROM DUAL UNION ALL
SELECT 1, DATE '2020-05-04', DATE '2020-09-04', 'N', 'Y' FROM DUAL UNION ALL
SELECT 1, DATE '2020-05-06', DATE '2020-06-26', 'N', 'Y' FROM DUAL UNION ALL
SELECT 1, DATE '2020-07-12', DATE '2020-08-12', NULL, NULL FROM DUAL UNION ALL
SELECT 1, DATE '2020-08-13', DATE '2020-08-12', NULL, NULL FROM DUAL;
这个输出:
身份证 | START_DATE | END_DATE |礼物 |缺席的
-: | :--------- | :-------- | :-------- | :-----
1 | 20 年 2 月 1 日 | 20 年 4 月 19 日 |是 | ñ
1 | 20 年 3 月 6 日 | 20 年 3 月 9 日 | N | ñ
1 | 20 年 5 月 4 日 | 04-SEP-20 | N |是
1 | 20 年 7 月 12 日 | 20 年 8 月 12 日 | 空 | 空
db小提琴here