首页 > 解决方案 > 查找几乎重复的记录

问题描述

我正在寻找一种方法来检索可能“或多或少”重复相同记录的数据。

样本数据:

+----+----------+------+--------------------------+
| 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 排序的数据集,其中包含几乎重复的数据。

标签: sqloracle

解决方案


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

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

要仅获取差异 <=2 天的记录,请使用

SQL小提琴

SELECT ID,"DATE",ITEM,DESCRIPTION 
 FROM   
    (SELECT T.*, 
        LEAD(TRUNC("DATE"), 1) OVER ( PARTITION BY ID ORDER BY "DATE") 
        - 
        TRUNC("DATE") 
    AS DIF1,

        TRUNC("DATE")
        -
        LAG(TRUNC("DATE"), 1) OVER (PARTITION BY ID ORDER BY "DATE") 
    AS DIF2
    FROM   FOCUS_SAMPLE T                   
    ) T1 
  WHERE  T1.DIF1 <= 2 OR T1.DIF2 <=2

要获取所有记录,以防有 1 个匹配项使用

SQL小提琴

SELECT * 
FROM   FOCUS_SAMPLE 
WHERE  ID IN (SELECT ID 
              FROM   (SELECT T.*, 
                             LEAD(TRUNC("DATE"), 1) 
                               OVER ( 
                                 PARTITION BY ID 
                                 ORDER BY "DATE") - TRUNC("DATE") AS DIF 
                      FROM   FOCUS_SAMPLE T) T1 
              WHERE  T1.DIF <= 2) 

推荐阅读