query - sql server delete duplicate rows but keep one
Ayuda de eliminaciĆ³n de SQL Query Duplicate (4)
Necesito eliminar registros semi duplicados de la siguiente tabla
ID PID SCORE
1 1 50
2 33 20
3 1 90
4 5 55
5 7 11
6 22 34
Para cualquier PID duplicado que exista, quiero eliminar el registro de menor puntaje. En el ejemplo anterior, ID 1 sería eliminado. Intento encontrar una forma de hacerlo sin usar bucles pero realmente estoy luchando.
Cualquier ayuda sería apreciada.
Gracias
No puedo ver tu consulta, así que hice este ejemplo ...
SELECT
PID,
MAX(Score)
FROM
tblTable
GROUP BY
PID
prueba esto..
declare @tt table(id int, pid int,score int)
insert into @tt
select 1,1,50 union all
select 2,33,50 union all
select 8,33,80 union all
select 3,1,90 union all
select 4,5,50 union all
select 5,5,10 union all
select 6,6,10 union all
select 7,6,50
---------
delete from @tt where id in (
select t1.id from @tt t1 inner join
(
select MIN(score) tScore,pid tPid from @tt where pid in
(select pid from @tt group by pid having count (pid) > 1) group by pid
) t2 on t1.pid=t2.tPid and t1.score=t2.tScore)
select * from @tt
WITH q AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY pid ORDER BY score) AS rn
FROM mytable
)
DELETE
FROM q
WHERE rn = 1
Para dejar los resultados que no tienen duplicados:
WITH q AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY pid ORDER BY score) AS rn,
COUNT(*) OVER (PARTITION BY pid) AS cnt
FROM mytable
)
DELETE
FROM q
WHERE rn = 1
AND cnt > 1
DELETE t.*
FROM Table1 t
JOIN (SELECT pid, MIN(score) minScore, MAX(id) maxId
FROM Table1
GROUP BY pid) t1
ON t.pid = t1.pid
AND t.score = t1.minScore
AND t.id < t1.maxId