code |
name |
date |
etc |
1 |
냉장고 |
20160404 |
전자제품하나 |
1 |
세탁기 |
20160202 |
전자제품둘 |
1 |
에어컨 |
20160303 |
전자제품셋 |
2 |
책상 |
20160305 |
공부도구 |
4 |
볼펜 |
20160301 |
필기구 |
4 |
샤프 |
20160307 |
고급필기구 |
4 |
연필 |
20160202 |
하급필기구 |
7 |
강아지 |
20160412 |
짐승 |
중복제거 하고 싶어요
code |
name |
date |
etc |
1 |
냉장고 |
20160404 |
전자제품하나 |
2 |
책상 |
20160305 |
공부도구 |
4 |
샤프 |
20160307 |
고급필기구 |
7 |
강아지 |
20160412 |
짐승 |
이런식으로 중복 제거하고 싶은데
어떻게 해야 하죠....
code기준으로 중복을 제거 하되 date가 최신것으로 남기고 제거 하려고 합니다.
Comment 14
-
이리
2016.04.21 11:51
-
아싸라비아콜롬비아
2016.04.21 14:05
새로운 기능 알게 해주셔서 감사합니다.
-
Terry
2016.04.21 12:14
;With tblA(code, name, date, etc) As
(
Select 1,'냉장고','20160404','전자제품하나' Union All
Select 1,'세탁기','20160202','전자제품둘' Union All
Select 1,'에어컨','20160303','전자제품셋' Union All
Select 2,'책상','20160305','공부도구' Union All
Select 4,'볼펜','20160301','필기구' Union All
Select 4,'샤프','20160307','고급필기구' Union All
Select 4,'연필','20160202','하급필기구' Union All
Select 7,'강아지','20160412','짐승'
)
Select a.*
From (
Select *
,Row_Number() Over (Partition By code Order By date Desc) As seq
From tblA
) a
Where a.seq = 1
-
아싸라비아콜롬비아
2016.04.21 14:06
친절하고 간결하게 감사합니다.
-
ilovejsp
2016.04.21 16:13
이렇게 하면 문제가 될수있습니다,
예를들면 '20160404'에 데이터가 두개있을 경우 가장 최신인것이 2개이므로
2개다 갖고와야되는데 한개밖에 못가져옵니다
-
Terry
2016.04.21 16:17
그 부분은 고려를 못했었네요 ^^;;
하기 항해자님이 달아주신 방법으로
코드별 grouping 후, max일자 로 뽑아서 데이터 가져오는 방식이 제일 정확할듯하네요..
-
항해자™
2016.04.21 12:17
동일 코드내에 같은 날짜가 있다면 어떻게 되나요?
위의 예시로만 보았을 때는 아래처럼 쿼리하면 될듯 하네요,,,
;with cteSample as ( select cCode , max(cDate) as cDate from dbo.tSample group by cCode ) select b.* from cteSample as a inner join dbo.tSample as b on b.cCode = a.cCode and b.cDate = a.cDate go
-
아싸라비아콜롬비아
2016.04.21 14:04
감사합니다 이런방법이 있었군요
-
줄리스트
2016.04.21 16:59
질문은 다른 분이 하셨는데
내가 더 감사하네요
잘 보고 갑니다
-
줄리스트
2016.04.21 17:05
근데 항해자님 항해장님 쿼리로 테스트 해보았는데
동일 날짜가 두개일 경우에는 중복제거가 안되는것 같아요
-
항해자™
2016.04.21 18:30
요구사항은 동일 날짜에 다수 데이터가 존재하면 모두 가져오는 것으로 알고 있습니다,, -
ilovejsp
2016.04.21 17:42
원본데이터
SELECT [code],[name],[date],[etc]
FROM [중복제거]code name date etc
1 냉장고 20160404 전자제품하나
1 냉장고 20160202 전자제품둘
1 세탁기 20160404 전자제품셋
1 에어컨 20160303 전자제품하나
2 책상 20160305 공부도구
4 볼펜 20160301 필기구
4 샤프 20160307 고급필기구
4 연필 20160202 하급필기구
7 강아지 20160412 짐승그리고 한 쿼리로 중복제거한데이터
select Code,max(Date) as Date,max(name) as name,max(etc) as etc
FROM [중복제거]
group by Code이렇게 하면 동일날짜 여러개는 안나오는데 Row_Number() ,CTE안쓰고도 한쿼리로할수있습니다
-
항해자™
2016.04.21 18:34
예상치 못한 결과가 나올 것 같은데요?
-
항해자™
2016.04.21 18:42
위 예제 데이터를 가지고 질문자가 원하는 결과는 아래와 같아야 합니다,,
"1, 냉장고, 20160404, 전자제품하나"
....
그러나, 위와 같이 쿼리하면 전혀 다른 결과를 볼수 있습니다,,
sqlserver 2005이상이시면 ROW_NUMBER() OVER(PARTITION BY code, ORDER BY date DESC) 를 이용하시면 될듯 합니다.