Sql 发现几乎重复的记录

Sql 发现几乎重复的记录,sql,oracle,Sql,Oracle,我正在寻找一种检索数据的方法,这些数据可能“或多或少”与同一条记录重复 样本数据: +----+----------+------+--------------------------+ | ID | Date | Item | Descripion | +----+----------+------+--------------------------+ | 11 | 1/1/2018 | CPU | CPU needs replacement |

我正在寻找一种检索数据的方法,这些数据可能“或多或少”与同一条记录重复

样本数据:

+----+----------+------+--------------------------+
| ID |   Date   | Item |        Descripion        |
+----+----------+------+--------------------------+
| 11 | 1/1/2018 | CPU  | CPU needs replacement    |
| 11 | 1/2/2018 | CPU  | CPU requires replacement |
| 12 | 1/1/2018 | CPU  | CPU needs replacement    |
+----+----------+------+--------------------------+
前两条记录重复,而最后一条记录不重复

逻辑

如果是相同的ID且时间跨度小于或等于2天,则持有相同的项目

输出

按ID排序的数据集,其中包含几乎重复的数据。

试试这样的方法, 这里我们使用rowid删除重复的行

create table temp as
select 11 id,sysdate mdate,'CPU' item,' CPU needs replacement' description from dual union all
select 11 id,sysdate-2 mdate,'CPU' item,'  CPU requires replacement' description from dual union all
select 12 id,sysdate mdate,'CPU' item,' CPU needs replacement' description from dual ;
供选择:

select * from temp where id in (
select  id from temp a where rowid not in (select max(rowid) from temp b where a.id=b.id and b.mdate  between a.mdate-2 and a.mdate  )
) order by id ;
删除:

delete * from temp a where rowid not in (select max(rowid) from temp b where a.id=b.id and b.mdate  between a.mdate-2 and a.mdate  );

首先,您不应该使用Oracle保留关键字作为列名,例如
DATE
,因为您必须始终将其置于双引号中

现在,我相信你需要像下面这样的东西,但是如果没有你的预期输出,很难说。此外,您应该尝试提供更好的结果集。在这种情况下,如果您有相同的
ID
多天,并且在任何一天或那些日子中,差异小于2天,您将获得所有行


要仅获取差异的记录,如果希望结果不存在“重复”,可以使用
NOT EXISTS
筛选两天内存在较早记录的行

SELECT *
       FROM "ELBAT" "T1"
       WHERE NOT EXISTS (SELECT *
                                FROM "ELBAT" "T2"
                                WHERE "T2"."ID" = "T1"."ID"
                                      AND "T2"."ITEM" = "T1"."ITEM"
                                      AND "T2"."ROWID" <> "T1"."ROWID"
                                      AND "T1"."DATE" - "T2"."DATE" >= 0
                                      AND "T1"."DATE" - "T2"."DATE" <= 2);
SELECT *
       FROM "ELBAT" "T1"
       WHERE EXISTS (SELECT *
                            FROM "ELBAT" "T2"
                            WHERE "T2"."ID" = "T1"."ID"
                                  AND "T2"."ITEM" = "T1"."ITEM"
                                  AND "T2"."ROWID" <> "T1"."ROWID"
                                  AND ABS("T1"."DATE" - "T2"."DATE") <= 2);

预期输出是什么?第1行和第2行?什么是2018年1月2日?1月2日(美国),还是2月1日(其他文明国家)?当你检查身份证上的精确匹配时,为什么说“几乎重复”?什么是“几乎”呢?要做到这一点,你需要以下信息:你想比较哪些记录。如何计算记录中字段之间的差异。如果两者都有,您可以加入,比较并选择比较值足够高的记录。2018年1月1日/2日第二天。有兴趣获得满足所有标准的所有记录。ID是相同的,并且在生产环境中运行脚本的日期仍然会带来唯一的记录和不接近重复的记录。您的查询没有解决不仅ID应该相等,而且项应该相同的问题。@szakwani:我为项添加了附加条件。一般来说没有改变。我使用了你的查询,它有两个主要问题。它会返回只有1个ID的记录,其次,该项不相等。我不明白这意味着什么。在此之前,考虑到发表一个新的问题,这一次包括一个全面的描述和一套全面的样本数据和预期的结果,从一开始就说明。
SELECT *
       FROM "ELBAT" "T1"
       WHERE NOT EXISTS (SELECT *
                                FROM "ELBAT" "T2"
                                WHERE "T2"."ID" = "T1"."ID"
                                      AND "T2"."ITEM" = "T1"."ITEM"
                                      AND "T2"."ROWID" <> "T1"."ROWID"
                                      AND "T1"."DATE" - "T2"."DATE" >= 0
                                      AND "T1"."DATE" - "T2"."DATE" <= 2);
SELECT *
       FROM "ELBAT" "T1"
       WHERE EXISTS (SELECT *
                            FROM "ELBAT" "T2"
                            WHERE "T2"."ID" = "T1"."ID"
                                  AND "T2"."ITEM" = "T1"."ITEM"
                                  AND "T2"."ROWID" <> "T1"."ROWID"
                                  AND ABS("T1"."DATE" - "T2"."DATE") <= 2);