【问题标题】:Using the number of days to delete the duplicate records in SQLSQL中使用天数删除重复记录
【发布时间】:2020-10-23 12:40:43
【问题描述】:

我在注册月份列第 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 行:约翰·史密斯在 7 月只注册了一天 而第 15 排的凯瑟琳就读了 30 天。从那里我想删除第 14 行并保留第 15 行。

我很难完成这项工作。任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: sql oracle datetime sql-delete


    【解决方案1】:

    我认为这是你想要的:

    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

    身份证 |姓名 |学期开始日期 |期限 |入学月 -: | :--------- | :------------ | :------------ | :--------------- 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

    【讨论】:

      【解决方案2】:

      您可以使用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

      【讨论】:

      • 如果期限结束日期是 20190703 怎么办
      • @B.Saleh 更新。
      猜你喜欢
      • 2016-01-07
      • 2016-09-17
      • 1970-01-01
      • 2020-07-16
      • 2021-02-13
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多