2017-10-05 6 views
0

나는이 열이있는 테이블이 중복 게시물을 삭제하는 SQL 스크립트를 작성합니다.어떻게

중복 된 (SQL 스크립트 사용) 모든 항목을 효과적으로 필터링 할 수 있고 최신 lastconnected 날짜가있는 항목을 어떻게 삭제할 수 있습니까?

+0

어떤 RDBMS가 이것에 해당합니까? 태그를 추가하여 mysql, postgresql, sql-server, oracle 또는 db2 중 어느 것을 사용하는지 지정하십시오. –

+0

그리고 동일한 imei와 이름을 가진 행이 3 개 (또는 그 이상)있을 때 어떻게됩니까? 여전히 그 행 중 하나만 삭제하고 나머지는 그대로 두길 원하십니까? – SMor

+0

SQL 서버 사용 –

답변

1

간단한 ROW_NUMBERDELETE해야 트릭 : 그런 다음 이름과 iemi의 각 조합에 대한 날짜의 최대를 선택하고

WITH CTE AS 
(
    SELECT *, 
      RN = ROW_NUMBER() OVER(PARTITION BY imei, [name] ORDER BY lastconnected DESC) 
    FROM dbo.YourTable 
) 
DELETE FROM CTE 
WHERE RN = 1; 
-1

는 특정 행 있음을 삭제합니다.

DELETE FROM yourtablee 
WHERE (lastconnecteddate,name,imei) in 
        (SELECT max(lastconnecteddate), name,imei 
        FROM yourtable 
       GROUP BY name,imei) 
1

이 용이하고 문제

DECLARE @table TABLE 
(
id int, 
name varchar(10), 
imei varchar(10) 
) 
insert into @table select 1, 'a','a' 
insert into @table select 2, 'b','a' 
insert into @table select 3, 'c','a' 
insert into @table select 4, 'a','a' 
insert into @table select 5, 'c','a' 
insert into @table select 6, 'a','a' 
insert into @table select 7, 'c','a' 
insert into @table select 8, 'a','a' 

WHILE (exists (select '' from @table group by name , imei having count(*) > 1)) 
BEGIN 
delete from @table where id in (
select max(id) from @table group by imei , name having count(*) > 1) 
End 

select * from @table 
1

나의 첫번째 본능을 해결할 수는 RANK()를 사용하는 것입니다. 이것은 물건이 여러 번 복제되는 경우 가장 최근의 물건뿐만 아니라 모든 물건을 지울 것입니다.

delete a 
    from (
     select id, imei, name, lastconnected, RANK() over(partition by imei, name order by lastconnected) as [rank] from #temp 
    ) as a 
    where a.rank>1