2017-12-01 21 views
0

저는 SQL을 처음 접했고 내가 잘못하고있는 것을 찾을 수 없었습니다. 동일한 행에있는 유일한 ID와 연도가 남아 있도록 임시 테이블에 대해 동일한 테이블의 다른 행과 2 개의 특정 열에 일치하는 필드가있는 행을 삭제하려면 노력하고있어 남아있는 행이 그 해의 ID에 대한 최대 날짜입니다.SQL 행은 존재하지 않는 곳에서 사용할 때 테이블에서 삭제되지 않으며 별개의 하위 쿼리를 선택하십시오.

My table: 
ID     Year     Date 
---------------------------------------------------- 
1     2017     01/05/2017 
1     2017     11/17/2017 
1     2017     08/07/2017 
1     2016     03/22/2017 
1     2016     04/01/2017 
2     2017     03/12/2017 
2     2016     02/03/2016 
2     2016     04/19/2016 

원하는 결과 :

ID     Year     Date 
---------------------------------------------------- 
1     2017     11/17/2017 
1     2016     04/01/2016 
2     2017     03/12/2017 
2     2016     04/19/2016 

내가 무엇을 가지고 : 나는 그것을 실행하면

DELETE FROM #Temp 
WHERE NOT EXISTS (
     SELECT DISTINCT 
       t1.ID, 
       t1.Year 
     FROM #Temp AS t1, 
      #Temp AS t2 
     WHERE t1.ID = t2.ID 
     AND t1.Year <> t2.Year 
     GROUP BY t1.ID, t1.Year) 

는 아무 것도 삭제되지 도착하지만 처음 두 행을 제거 할 때 삭제 될 것입니다 무슨 테스트 결과가 정확하므로 혼란 스럽습니다. MAX 함수에 대해 작업하고 있지만이 부분이 먼저 작동하기를 원합니다.

도움이 될 것입니다. 나는 그것이 무엇이 잘못 될 수 있는지 전혀 모른다.

+1

내가 MySQL의 태그를 제거했습니다 .. ID에 따라 중복 된 기록을 찾을 수 row_number() 기능을 사용하는 것입니다. #table 구문 사용법을 기반으로합니다. –

+0

exists 절은 외부 쿼리와 상관 관계가 없습니다. 항상 행을 반환하므로 "존재하지 않음"은 항상 false입니다. 일반적으로 "distinct"의 사용은 종종 쿼리가 논리적으로 결함이 있음을 나타냅니다. 여기에 전혀 목적이 없습니다. 다른 사람들이 게시 한 것처럼 윈도우 기능을 사용하는 방법을 배웁니다. – SMor

답변

0

다른 한 방법은 SQL 서버를 사용하는 것처럼 보이기 때문에 Year

delete t from 
(
    select *, row_number() over (partition by ID, [Year] order by date desc) rn from <table> 
) t where t.rn > 1 
+0

감사합니다! 이것은 완벽하게 작동했습니다! 왜 아직도 광산이 작동하지 않았는지 모르겠지만 지금은 파티션에 대해 알고 행 번호를 사용하고 있습니다. – LillyBran

0
with cte as 
(
    select row_number() over (partition by ID, Year order by date desc) as rn 
) 
delete * from cte where rn > 1;