2017-09-13 1 views
0

다음과 같은 표가 있습니다.가장 높은 날짜를 제외한 모든 행을 삭제하십시오.

ID | Create Date 
---+------------------------- 
1 | 2007-06-12 15:44:10:000 
1 | 2007-07-12 15:44:10:000 
2 | 2007-06-12 15:44:10:000 
2 | 2007-07-12 15:44:10:000 
2 | 2007-08-12 15:44:10:000 
3 | 2007-09-12 15:44:10:000 
4 | 2012-06-12 15:44:10:000 
5 | 2011-07-12 15:44:10:000 

나는 다른 모든 행을 삭제하는 동안 max(createdate)을 유지해야합니다. ID 3,4,5로 행을 유지해야합니다.

도움이 될 것입니다.

참고 : 약간 추상적입니다. 실제 테이블은 다른 많은 중복 ID를 시도 날짜를

+1

어떤 DBMS를 사용하고 있습니까? SQL Server? MySQL은? 신탁? 다른 것? – Siyual

+0

Sql server 2008 r2 –

+0

SO는 질문을하고 답변을 얻으려는 훌륭한 사이트입니다. [MCVE] (https://stackoverflow.com/help/mcve)를 제공하십시오. 질문하기 전에 [오리에게 먼저 이야기하십시오] (https://blog.codinghorror.com/rubber-duck-problem-solving/)를 고려하십시오. 네, 진심이에요! 저희가 도와 드릴 수 있도록 샘플 데이터 및 예상 결과를 생성하십시오. [ascii 테이블] (https://ozh.github.io/ascii-tables/)은 출력을 읽기 쉽게 만듭니다! 또한 데이터를 조롱하고 SQL은 http://rextester.com/ 또는 유사한 사이트를 사용하여 시도했습니다. 거의 모든 것이 가능합니다. 우리가해야 할 문제입니다. 우리는 할 수 없습니다. – xQbert

답변

3
당신은 가장 최근의 날짜가 기록을 식별하고 나머지를 삭제 ROW_NUMBER()을 사용할 수 있습니다

:

;With ToDelete As 
(
    Select *, 
      Row_Number() Over (Partition By Id Order By CreateDate Desc) RN 
    From YourTable 
) 
Delete ToDelete 
Where RN <> 1 
0

을 만들 수있는 ID의 수백만을 가지고이 :

DELETE FROM table 
WHERE ID NOT IN (SELECT ID FROM table 
WHERE ID IN 3, 4, 5 OR ID = (SELECT ID FROM table as a 
          WHERE createdate = (SELECT MAX(createdate) FROM 
           table as b WHERE a.ID = b.ID))) 
+0

죄송합니다. 제가 준 샘플은 약간 추출물이었습니다. 실제 테이블에는 생성 날짜가 다른 많은 공개 ID가있는 수백만 개의 ID가 있습니다. –

관련 문제