2015-03-24 3 views
0

Я пытался создать таблицу с 2 столбцами party_id и matched_party_id для идентификации дубликатов, как описано ниже:SQL разделов и использование аналитических функций

Как вы видите, глядя на [First_NM + Last_NM + Zip_CD] мы может идентифицировать несколько повторяющихся записей. Я хочу, чтобы соответствовать этим и держать их в зонте наиболее происходящего party_id

PARTY_ID FIRST_NM LAST_NM ZIP_CD 
----------------------------------------  
95678 JANE DOE 7075 
12345 JOHN DOE 7000 
10000 JOHN DOE 7075 
10000 JOHN DOE 7075 
95678 JOHN DOE 7075 
95678 JOHN DOE 7075 
95678 JOHN DOE 7075 
88648 JOHN DOE 7075 
88648 JOHN DOE 7075 
23456 JOHN DOE 7075 
95678 SAM DOE 7075 
95678 SAM DOE 7075 

Обязательного выход

Party_ID Matched_ID 
----------------------- 
95678 10000 
95678 88648 
95678 23456 

поскольку в пределах раздела дублей мы определили 4 отчетливого party_id-х именно 95678,10000, 88648 и 23456 и 95678 происходит больше всего раз, поэтому необходимо сопоставить все другие party_id с этим party_id.

Это код, который я использую. Но стенает LEAD_PI нулевые значения

SELECT MAX_PI AS PARTY_ID, LEAD_PI AS MATCHED_ID from 
(SELECT DISTINCT B.FIRST_NM, B.MDDL_NM, B.LAST_NM, B.ZIP_CD,MAX_PI,LEAD_PI, 
FROM (SELECT I.PARTY_ID,I.FIRST_NM, I.MDDL_NM, I.LAST_NM,A.ZIP_CD, 
      LEAD(I.PARTY_ID) OVER (PARTITION BY I.FIRST_NM, I.MDDL_NM, I.LAST_NM, A.ZIP_CD ORDER BY I.FIRST_NM, I.MDDL_NM,I.LAST_NM, A.ZIP_CD) AS LEAD_PI, MAX(I.PARTY_ID) OVER (PARTITION BY I.FIRST_NM, I.MDDL_NM, I.LAST_NM, A.ZIP_CD) AS MAX_PI 
     FROM INDVDL I JOIN PARTY_ADDR A 
     ON I.PARTY_ID = A.PARTY_ID 
    ) B 
WHERE MIN_PI <> MAX_PI 
AND MAX_PI <> nvl(LEAD_PI,0) 
+0

Это для oracle rdbms – user3002581

+0

Что делать, если две партии_изы совпадают, и оба происходят одинаковое количество раз? Как вы выбираете тот, который соответствует другим? –

+0

в этом сценарии мы можем выбрать функцию max и выбрать party_id, который больше, чем другой. – user3002581

ответ

0

Было бы немного проще, если ваша базовая таблица не содержит никаких полностью повторяющиеся строки (и я не уверен, что может быть значение такого полного дублирования), но вы может сделать это с данными, как описано. Похоже, что-то вдоль этих линий будут делать то, что вы хотите:

вида
SELECT DISTINCT party_id, matched_id 
FROM (
    SELECT 
     MAX(i.party_id) OVER (
     PARTITION BY i.first_nm, i.middle_nm, i.last_nm, a.zip_cd 
    ) AS party_id, 
     i.party_id AS matched_id 
    FROM 
     indvdl i 
     JOIN party_addr a 
     ON i.party_id = a.party_id 
) 
WHERE party_id != matched_id 

Рядных делает немного более простое выражение этого запроса, но я думаю, что вы могли бы обойтись. Вы также можете получить результаты, которые вы хотите без использования функции окна:

WITH nz AS (SELECT i.party_id, i.first_nm, i.last_nm, a.zip_cd 
    FROM indvdl i JOIN party_addr a ON i.party_id = a.party_id) 
SELECT DISTINCT 
    ref.party_id AS party_id, 
    matched.party_id AS matched_id 
FROM (
    SELECT MAX(party_id) AS party_id, first_nm, last_nm, zip_cd 
    FROM nz 
    GROUP BY first_nm, last_nm, zip_cd 
    HAVING MAX(party_id) != MIN(party_id) 
) ref 
    JOIN nz matched 
    ON ref.first_nm = matched.first_nm 
     AND ref.last_nm = matched.last_nm 
     AND ref.zip_cd = matched.zip_cd 
WHERE ref.party_id != matched.party_id 

В любом случае, я подозреваю, что функция LEAD() не делать то, что вы думаете, и я уверен, что он не делает то, что вы потребность в этой работе.

Смежные вопросы