您可以使用DENSE_RANK(或ROW_NUMBER)分析函数将具有重复EnrollmentMonths 的行按这些月内最长的时间顺序排列,然后使用ROWID 伪列有效地与DELETE:
DELETE FROM table_name
WHERE ROWID IN (
SELECT ROWID
FROM (
SELECT DENSE_RANK() OVER (
PARTITION BY EnrollmentMonths
ORDER BY LEAST( LAST_DAY( EnrollmentMonths ), TermEndDate )
- GREATEST( EnrollmentMonths, TermStartDate )
DESC
) AS rnk
FROM table_name
)
WHERE rnk > 1
)
其中,对于样本数据:
CREATE TABLE table_name ( ID, Name, TermStartDate, TermEndDate, EnrollmentMonths ) AS
SELECT 1, 'John Smith', DATE '2018-02-01', DATE '2018-03-31', DATE '2018-02-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-02-01', DATE '2018-03-31', DATE '2018-03-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-08-01', DATE '2018-08-31', DATE '2018-08-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-09-01', DATE '2018-09-30', DATE '2018-09-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2018-10-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2018-11-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2018-12-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2019-01-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2019-02-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2019-03-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2019-04-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2019-05-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2019-06-01' FROM DUAL UNION ALL
SELECT 1, 'John Smith', DATE '2018-10-01', DATE '2019-07-01', DATE '2019-07-01' FROM DUAL UNION ALL
SELECT 1, 'Catherine', DATE '2019-07-02', DATE '2019-11-30', DATE '2019-07-01' FROM DUAL UNION ALL
SELECT 1, 'Catherine', DATE '2019-07-02', DATE '2019-11-30', DATE '2019-08-01' FROM DUAL UNION ALL
SELECT 1, 'Catherine', DATE '2019-07-02', DATE '2019-11-30', DATE '2019-09-01' FROM DUAL UNION ALL
SELECT 1, 'Catherine', DATE '2019-07-02', DATE '2019-11-30', DATE '2019-10-01' FROM DUAL UNION ALL
SELECT 1, 'Catherine', DATE '2019-07-02', DATE '2019-11-30', DATE '2019-11-01' FROM DUAL;
删除一行并将表格保留为:
SELECT * FROM table_name;
身份证 |姓名 |学期开始日期 |期限 |入学月
-: | :--------- | :------------ | :------------ | :---------------
1 |约翰·史密斯 | 20180201 | 20180331 | 20180201
1 |约翰·史密斯 | 20180201 | 20180331 | 20180301
1 |约翰·史密斯 | 20180801 | 20180831 | 20180801
1 |约翰·史密斯 | 20180901 | 20180930 | 20180901
1 |约翰·史密斯 | 20181001 | 20190701 | 20181001
1 |约翰·史密斯 | 20181001 | 20190701 | 20181101
1 |约翰·史密斯 | 20181001 | 20190701 | 20181201
1 |约翰·史密斯 | 20181001 | 20190701 | 20190101
1 |约翰·史密斯 | 20181001 | 20190701 | 20190201
1 |约翰·史密斯 | 20181001 | 20190701 | 20190301
1 |约翰·史密斯 | 20181001 | 20190701 | 20190401
1 |约翰·史密斯 | 20181001 | 20190701 | 20190501
1 |约翰·史密斯 | 20181001 | 20190701 | 20190601
1 |凯瑟琳 | 20190702 | 20191130 | 20190701
1 |凯瑟琳 | 20190702 | 20191130 | 20190801
1 |凯瑟琳 | 20190702 | 20191130 | 20190901
1 |凯瑟琳 | 20190702 | 20191130 | 20191001
1 |凯瑟琳 | 20190702 | 20191130 | 20191101
db小提琴here