微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用天数删除SQL中的重复记录

如何解决使用天数删除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
)

当给定的注册月份有多个行时,这将删除该月份中天数较少的行。如果有关系,则两者都会保留。

Demo on DB Fiddle

 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 举报,一经查实,本站将立刻删除。