2017-12-22 22 views
0

나는 데이터베이스 테이블에서 데이터를 가지고 있고이 같은 파일이 수출하고있어 100,000 기록 (이이 종류의 ID를 기반으로 중복)제거 중복

  id  | dp_1 | pp_1 | Phone | 
      -------|---------|-------|--------| 
      1  | dp1  |  | phone1 | 
      ----------------------------------| 
      1  |   | pp1 | phone1 | 
      ----------------------------------| 
      2  | dp2 | pp2 | phone2 | 
      ------------------------------------ 
      2  |   |  | phone4 | 
      ----------------------------------- 
      3  | dp3 | pp3 | phone3 | 
      ------------------------------------ 
      3  | dp3 |  | phone3 | 
      ----------------------------------- 
      4  |   | pp4 |  | 
      ------------------------------------ 
      4  | dp4 |  |  | 
주변에있다 나는 t을 달성 할 수있는 방법

WITH cte AS (
    SELECT*, 
row_number() OVER(PARTITION BY id,DP_1, PP_1, phone ORDER BY id desc) 
AS [rn] 
FROM table1 
    ) 
Select * into #temp from cte WHERE [rn] = 1 ORDER BY id 

:

  id  | dp_1 | pp_1 | Phone   | 
      -------|---------|-------|-----------------| 
      1  | dp1  | pp1 | phone1 - phone1 | 
      -------------------------------------------| 
      2  | dp2  | pp2 | phone2 - phone4 | 
      -------------------------------------------| 
      3  | dp3  | pp3 | phone3   | 
      -------------------------------------------| 

      4  | dp4 | pp4 |     | 
      -------------------------------------------- 

나는이 SQL을 작성했습니다 :

나는 아래로 결과를 원 그의 파이썬에서 또는 SQL 쿼리를 사용하여? 나는 아나콘다를 사용하고있다.

+0

왜 id3은 단지'phone3'을 가지고 있지만 id1은'phone1-phone1'을 가지고 있는가? 이 2 가지 논리가 다른 이유는 무엇입니까? – Larnu

+0

여기에서 Refereed : https://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string 여전히 몇 가지 사항을 수정해야합니다. – AskMe

답변

1

id 1과 3의 전화 논리가 서로 다른 이유가 이해가되지 않습니다. 하나는 숫자 중복, 하나는 중복되지 않습니다. 이 답변은 전화를 복제하거나 (ID 1처럼) DISTINCT 값 (예 : id 3)을 반환 할 수 있습니다. GROUP BY의 주석을 제거하여 논리를 변경할 수 있습니다.

--Sample Data 
WITH VTE AS (
    SELECT * 
    FROM (VALUES (1,'dp1',NULL,'phone1'), 
       (1,NULL,'pp1','phone1'), 
       (2,'dp2','pp2','phone2'), 
       (2,NULL,NULL,'phone4'), 
       (3,'dp3','pp2','phone3'), 
       (3,'dp3',NULL,'phone3')) V(id, dp_1, pp_1, phone)) 
--And the answer 
SELECT id, 
     MAX(dp_1) AS dp_1, 
     MAX(pp_1) AS pp_1, 
     STUFF((SELECT ' - ' + sq.phone 
       FROM VTE sq 
       WHERE sq.id = VTE.id 
       AND phone <> '' 
       --GROUP BY sq.phone --If you only want to display unique phones, uncomment the GROUP BY. 
       FOR XML PATH('')),1,3,'') AS [phone] 
FROM VTE 
GROUP BY id; 
+0

전화 번호가 비어 있으면 문제가 생긴 것 같습니다. 빈 전화 번호 시나리오에 대한 질문을 수정했습니다. 나는 이처럼 열을 가질 수있다. (그냥 모아서 몇 가지 예를 든다.) – AskMe

+0

@AskMe blank 또는 NULL? 또한, "문제"는 무엇입니까? – Larnu

+0

@Askme'phone'의 값이 비어 있다면 질의를 수정했습니다. ** ** ** not ** *와 같지 않습니다. ** 당신이 공백으로 지정한대로 나는 그 일에만 음식을 제공해야합니다. *'NULL'에 대한 * 전체 서브 쿼리 주위에'IS NOT NULL'과 (아마) ISNULL을 추가하는 것이 좋습니다. ID 1과 ID 3에 대한 논리는 아직 변경되지 않았습니다. 아직 이에 대한 응답이 없습니다. 감사. – Larnu

0

이 쿼리는

;With cte(id,dp_1,pp_1,Phone) 
AS 
(   
SELECT 1 , 'dp1' , NULL , 'phone1' UNION ALL 
SELECT 1 , NULL , 'pp1' , 'phone1' UNION ALL 
SELECT 2 , 'dp2' , 'pp2' , 'phone2' UNION ALL 
SELECT 2 , NULL , NULL , 'phone4' UNION ALL 
SELECT 3 , 'dp3' , 'pp3' , 'phone3' UNION ALL 
SELECT 3 , 'dp3' , NULL , 'phone3' 
) 
SELECT 
    DISTINCT id , 
    MAX(dp_1)OVER(PARTITION BY id ORDER BY id) AS dp_1 , 
    MAX(pp_1)OVER(PARTITION BY id ORDER BY id) AS pp_1, 
STUFF((SELECT DISTINCT ' - ' + Phone FROM cte i WHERE i.id=o.id 
FOR XML PATH ('')),1,2,'') AS Phone 
FROM cte o 

결과를 귀하의 예상 결과 제공 파이썬에서

id dp_1  pp_1 Phone 
-------------------------------- 
1 dp1  pp1  phone1 
2 dp2  pp2  phone2 - phone4 
3 dp3  pp3  phone3 
0

귀하의 경우 가장 좋은 방법은 pandas입니다. 나는 또한 내가 당신의 테이블을 생성,

먼저 귀하의 경우에는 "전화"에 대해 고유 한 변수를 선택 numpy를 사용

df = pd.DataFrame(data={'id': [1, 1, 2, 2, 3, 3], 
         'dp_1': ['dp1', np.nan, 'dp2', np.nan, 'dp3', 'dp3'], 
         'pp_1': [np.nan, 'pp1', 'pp2', np.nan, 'pp3', np.nan], 
         'Phone': ['phone1 ', 'phone1 ', 'phone2 ', 'phone4 ', 'phone2 ', 'phone3 ']}) 

가 그럼 난 함수를 작성 (SQL에서 읽는 것 같아요 별도의 질문) 그룹화에 적용됩니다.

def unique_sum(str_list): 
    return np.sum(np.unique(str_list)) 

다음으로 groupby를 적용하십시오. 나는 그것이 당신이 필요로하기를 바란다.

df.groupby('id').aggregate({'dp_1': 'last', 'pp_1': 'last', 'Phone': unique_sum}) 


    pp_1   Phone dp_1 
id       
1 pp1   phone1 dp1 
2 pp2 phone2 phone4 dp2 
3 pp3 phone2 phone3 dp3