如何解决使用天数删除SQL中的重复记录
我要在注册月份第14,15行中执行的操作是通过保留更多的注册天数来删除重复项。 (在sql Oracle中)
ID Name TermStartDate TermEndDate EnrollmentMonths
1 1 John Smith 20180201 20180331 20180201
2 1 John Smith 20180201 20180331 20180301
3 1 John Smith 20180801 20180831 20180801
4 1 John Smith 20180901 20180930 20180901
5 1 John Smith 20181001 20190701 20181001
6 1 John Smith 20181001 20190701 20181101
7 1 John Smith 20181001 20190701 20181201
8 1 John Smith 20181001 20190701 20190101
9 1 John Smith 20181001 20190701 20190201
10 1 John Smith 20181001 20190701 20190301
11 1 John Smith 20181001 20190701 20190401
12 1 John Smith 20181001 20190701 20190501
13 1 John Smith 20181001 20190701 20190601
14 1 John Smith 20181001 20190701 20190701
15 1 Catherine 20190702 20191130 20190701
16 1 Catherine 20190702 20191130 20190801
17 1 Catherine 20190702 20191130 20190901
18 1 Catherine 20190702 20191130 20191001
19 1 Catherine 20190702 20191130 20191101
为了说明, 第14行:约翰·史密斯(John Smith)在7月只有一天 而第15行中的凯瑟琳报名了30天。从那里我要删除第14行,并保留第15行。
我很难完成这项工作。任何帮助将不胜感激。
谢谢
解决方法
我认为这可以满足您的需求
delete from mytable t
where least(termenddate,last_day(enrollmentmonths)) - greatest(termstartdate,enrollmentmonths) < (
select max(least(t1.termenddate,last_day(t1.enrollmentmonths)) - greatest(t1.termstartdate,t1.enrollmentmonths))
from mytable t1
where t1.enrollmentmonths = t.enrollmentmonths
)
当给定的注册月份有多个行时,这将删除该月份中天数较少的行。如果有关系,则两者都会保留。
ID | NAME | TERMSTARTDATE | TERMENDDATE | ENROLLMENTMONTHS -: | :--------- | :------------ | :---------- | :--------------- 1 | John Smith | 20180201 | 20180331 | 20180201 1 | John Smith | 20180201 | 20180331 | 20180301 1 | John Smith | 20180801 | 20180831 | 20180801 1 | John Smith | 20180901 | 20180930 | 20180901 1 | John Smith | 20181001 | 20190701 | 20181001 1 | John Smith | 20181001 | 20190701 | 20181101 1 | John Smith | 20181001 | 20190701 | 20181201 1 | John Smith | 20181001 | 20190701 | 20190101 1 | John Smith | 20181001 | 20190701 | 20190201 1 | John Smith | 20181001 | 20190701 | 20190301 1 | John Smith | 20181001 | 20190701 | 20190401 1 | John Smith | 20181001 | 20190701 | 20190501 1 | John Smith | 20181001 | 20190701 | 20190601 1 | Catherine | 20190702 | 20191130 | 20190701 1 | Catherine | 20190702 | 20191130 | 20190801 1 | Catherine | 20190702 | 20191130 | 20190901 1 | Catherine | 20190702 | 20191130 | 20191001 1 | Catherine | 20190702 | 20191130 | 20191101,
您可以使用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,DATE '2018-03-01' FROM DUAL UNION ALL
SELECT 1,DATE '2018-08-01',DATE '2018-08-31',DATE '2018-08-01' FROM DUAL UNION ALL
SELECT 1,DATE '2018-09-01',DATE '2018-09-30',DATE '2018-09-01' FROM DUAL UNION ALL
SELECT 1,DATE '2018-10-01',DATE '2019-07-01',DATE '2018-10-01' FROM DUAL UNION ALL
SELECT 1,DATE '2018-11-01' FROM DUAL UNION ALL
SELECT 1,DATE '2018-12-01' FROM DUAL UNION ALL
SELECT 1,DATE '2019-01-01' FROM DUAL UNION ALL
SELECT 1,DATE '2019-02-01' FROM DUAL UNION ALL
SELECT 1,DATE '2019-03-01' FROM DUAL UNION ALL
SELECT 1,DATE '2019-04-01' FROM DUAL UNION ALL
SELECT 1,DATE '2019-05-01' FROM DUAL UNION ALL
SELECT 1,DATE '2019-06-01' FROM DUAL UNION ALL
SELECT 1,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,DATE '2019-09-01' FROM DUAL UNION ALL
SELECT 1,DATE '2019-10-01' FROM DUAL UNION ALL
SELECT 1,DATE '2019-11-01' FROM DUAL;
删除一行并将表保留为:
SELECT * FROM table_name;
ID | NAME | TERMSTARTDATE | TERMENDDATE | ENROLLMENTMONTHS -: | :--------- | :------------ | :---------- | :--------------- 1 | John Smith | 20180201 | 20180331 | 20180201 1 | John Smith | 20180201 | 20180331 | 20180301 1 | John Smith | 20180801 | 20180831 | 20180801 1 | John Smith | 20180901 | 20180930 | 20180901 1 | John Smith | 20181001 | 20190701 | 20181001 1 | John Smith | 20181001 | 20190701 | 20181101 1 | John Smith | 20181001 | 20190701 | 20181201 1 | John Smith | 20181001 | 20190701 | 20190101 1 | John Smith | 20181001 | 20190701 | 20190201 1 | John Smith | 20181001 | 20190701 | 20190301 1 | John Smith | 20181001 | 20190701 | 20190401 1 | John Smith | 20181001 | 20190701 | 20190501 1 | John Smith | 20181001 | 20190701 | 20190601 1 | Catherine | 20190702 | 20191130 | 20190701 1 | Catherine | 20190702 | 20191130 | 20190801 1 | Catherine | 20190702 | 20191130 | 20190901 1 | Catherine | 20190702 | 20191130 | 20191001 1 | Catherine | 20190702 | 20191130 | 20191101
db 提琴here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。