중복제거에 관하여 질문이 있습니다. 0 8 2,380

by Ejay [SQLServer] 중복제거 mssql [2015.09.09 17:06:36]


현재 select * from db 라는 쿼리를 사용하고 있습니다만,

중복값이 좀 있어서 한 필드에 대해서만 중복값 제거를 하고싶습니다. 

SELECT distinct TOP 10 name <- 이름에 대해서만 중복값 제거를 하고 다른 쿼리는 그대로

출력되게 할려면 어떤 식으로 접근해야 되는건가요

도움 좀 주세요! ㅜㅜ

by 아발란체 [2015.09.09 17:15:34]

홍길동 10살 서울

홍길동 20살 대전

 

이렇게 데이타가 2건 있을 때 같은 이름으로, 이름 기준으로 중복 제거하되 다른 항목인 나이, 지역도 출력 되어야 한다면 이름은 홍길동 1건만 떠나 하는데, 다른 정보는 10살도 있고, 20살도 있는데 어떤 기준으로 1건만 보여야 할지, 기준이 필요합니다. 같은 얘기로 홍길동 나이 10살이 보여야 하나요? 20살이 보여야 하나요? 컴퓨터에게 기준을 정해주지 않으면 결국 홍길동 이름 2건 뜹니다.


by Ejay [2015.09.09 17:28:29]

아래와 같은 데이터가 있다고 가정 했을 때!

두 번째 필드가 "1" 일 경우와 "0" 일 경우에 첫 번째 필드에 대해서 중복제거를 하고싶습니다.

 "1" 일 경우에는 시간정렬이 asc 고 "0" 일 경우엔 시간정렬이 desc 로요.

위에 쿼리를 적용한다면 아래 데이터에선 빨간 색 부분만 출력이 돼야하는데 어렵습니다ㅜㅜ

20141223102440506_0.bmp    0    정문    NULL       2015-09-09 16:01:46.267
20141223102440506_0.bmp    1    정문    NULL       2015-09-09 16:02:30.850

20141223102440506_0.bmp    1    정문    NULL       2015-09-09 16:03:48.617


by 아발란체 [2015.09.09 18:13:33]
WITH T(a, b, c, d, e) AS (
  SELECT '20141223102440506_0.bmp', 0, '정문', NULL, '2015-09-09 16:01:46.267' FROM DUAL
  UNION ALL SELECT '20141223102440506_0.bmp', 1, '정문', NULL, '2015-09-09 16:02:30.850' FROM DUAL
  UNION ALL SELECT '20141223102440506_0.bmp', 1, '정문', NULL, '2015-09-09 16:03:48.617' FROM DUAL
)  
SELECT
  a, b, c, d, MIN(e)
FROM
  T 
GROUP BY  
  a, b, c, d

 


by Ejay [2015.09.09 18:29:36]

감사합니다. 주신 걸로 다시 잘 해보겠습니다.


by 마농 [2015.09.09 17:58:46]
SELECT *
  FROM (SELECT file_nm
             , flag
             , c1, c2, c3
             , tm
             , ROW_NUMBER() OVER(
               PARTITION BY file_nm, flag
               ORDER BY CASE flag WHEN 0 THEN tm END DESC
                      , CASE flag WHEN 1 THEN tm END ASC
               ) rn
          FROM t
        ) a
 WHERE rn = 1
;

 


by Ejay [2015.09.09 18:32:31]

마농님 늘 감사드립니다!


by 신이만든짝퉁 [2015.09.09 18:26:30]

저는 이렇게 해봤습니다.

WITH T AS (
SELECT '20141223102440506_0.bmp' COL1,  0 COL2, '정문' COL3, NULL COL4,  TO_TIMESTAMP('2015-09-09 16:01:46.267', 'YYYY-MM-DD HH24:MI:SS.FF') COL5 FROM DUAL
UNION ALL
SELECT '20141223102440506_0.bmp' COL1,  0 COL2, '정문' COL3, NULL COL4,  TO_TIMESTAMP('2015-09-09 16:04:00.000', 'YYYY-MM-DD HH24:MI:SS.FF') COL5 FROM DUAL
UNION ALL
SELECT '20141223102440506_0.bmp' COL1,  1 COL2, '정문' COL3, NULL COL4,  TO_TIMESTAMP('2015-09-09 16:02:30.850', 'YYYY-MM-DD HH24:MI:SS.FF') COL5 FROM DUAL
UNION ALL
SELECT '20141223102440506_0.bmp' COL1,  1 COL2, '정문' COL3, NULL COL4,  TO_TIMESTAMP('2015-09-09 16:03:48.617', 'YYYY-MM-DD HH24:MI:SS.FF') COL5 FROM DUAL
)
SELECT *
  FROM (
SELECT COL1, COL2, COL3, COL4, COL5
     , ROW_NUMBER() OVER(PARTITION BY COL1, COL2 ORDER BY COL5 ASC) RN1      
     , ROW_NUMBER() OVER(PARTITION BY COL1, COL2 ORDER BY COL5 DESC) RN2
  FROM T)
 WHERE (COL2 = 0 AND RN2 = 1) OR (COL2 = 1 AND RN1 = 1);

 


by Ejay [2015.09.09 18:32:50]

이 방법도 한번 해보도록하겠습니다! 감사합니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입