识别具有不同ID的分区中的重复项

时间:2015-03-21 16:22:57

标签: sql duplicates partition

我是SQL和数据分析的新手。 我有一个场景我试图识别使用SQL分区。 基本上我想找到重复项[相同的first_name,last_name,后缀代码和邮政编码,但前提是id不同。

此查询只给出了部分不正确的结果...我知道我在这里和那里都缺少过滤器。

SELECT i.party_id,
    I.FIRST_NM,
    I.LAST_NM,
    I.SFFX_CD,
    A.ZIP_CD,
    ROW_NUMBER() OVER (PARTITION BY I.FIRST_NM,
    I.LAST_NM,
    I.SFFX_CD,
    A.ZIP_CD
    ORDER BY I.PARTY_ID) AS RN 
    FROM INDVDL I,
    PARTY_ADDR A
  WHERE I.PARTY_ID = A.PARTY_ID

我应该只获得标有**而不是其余的

PARTY_ID FIRST_NM LAST_NM SFFX_CD ZIP_CD RN

886874  John    Doe Jr. 45402   1
886874  John    Doe Jr. 45406   1
934635  John    Doe Jr. 45406   2
886874  John    Doe Jr. 45415   1
886874  John    Doe Jr. 45415   2
886874  John    Doe Jr. 45415   3
886874  John    Doe Jr. 45415   4
886874  John    Doe Jr. 45415   5
886874  John    Doe Jr. 45415   6
**886874    John    Doe Jr. 45415   7
**934635    John    Doe Jr. 45415   8
934635  John    Doe Jr. 45415   9
934635  John    Doe Jr. 45415   10

1 个答案:

答案 0 :(得分:0)

这是我的建议。使用窗口函数可以获得您想要的组的PARTY_ID的最小值和最大值。然后,过滤以仅返回不同的行:

SELECT *
FROM (SELECT i.*, a.*,
             MIN(I.PARTY_ID) OVER (PARTITION BY I.FIRST_NM, I.LAST_NM, I.SFFX_CD, A.ZIP_CD) as min_pi,
             MAX(I.PARTY_ID) OVER (PARTITION BY I.FIRST_NM, I.LAST_NM, I.SFFX_CD, A.ZIP_CD) as max_pi
      FROM INDVDL I JOIN
           PARTY_ADDR A
           ON I.PARTY_ID = A.PARTY_ID
     ) ia
WHERE min_pi <> max_pi;

注意:我修复了您的join语法以使用显式连接。简单规则:永远不要在from子句中使用逗号。

另外,为方便起见,我将列列表替换为*。添加您想要的列。