나는이 열이있는 테이블이 중복 게시물을 삭제하는 SQL 스크립트를 작성합니다.어떻게
중복 된 (SQL 스크립트 사용) 모든 항목을 효과적으로 필터링 할 수 있고 최신 lastconnected
날짜가있는 항목을 어떻게 삭제할 수 있습니까?
나는이 열이있는 테이블이 중복 게시물을 삭제하는 SQL 스크립트를 작성합니다.어떻게
중복 된 (SQL 스크립트 사용) 모든 항목을 효과적으로 필터링 할 수 있고 최신 lastconnected
날짜가있는 항목을 어떻게 삭제할 수 있습니까?
간단한 ROW_NUMBER
및 DELETE
해야 트릭 : 그런 다음 이름과 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;
는 특정 행 있음을 삭제합니다.
DELETE FROM yourtablee
WHERE (lastconnecteddate,name,imei) in
(SELECT max(lastconnecteddate), name,imei
FROM yourtable
GROUP BY name,imei)
이 용이하고 문제
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
나의 첫번째 본능을 해결할 수는 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
어떤 RDBMS가 이것에 해당합니까? 태그를 추가하여 mysql, postgresql, sql-server, oracle 또는 db2 중 어느 것을 사용하는지 지정하십시오. –
그리고 동일한 imei와 이름을 가진 행이 3 개 (또는 그 이상)있을 때 어떻게됩니까? 여전히 그 행 중 하나만 삭제하고 나머지는 그대로 두길 원하십니까? – SMor
SQL 서버 사용 –