2009-10-12 57 views
1

我需要从下表SQL查询删除重复说明

ID  PID  SCORE 
1  1  50 
2  33  20 
3  1  90 
4  5  55 
5  7  11 
6  22  34 

对于任何除去半重复记录重复的PID的存在我想删除的最低得分纪录。在上面的例子中,ID 1将被删除。我试图想出一种不使用循环的方式,但真的很挣扎。

任何帮助,将不胜感激。

感谢

回答

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 
0
WITH q AS 
     (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY pid ORDER BY score) AS rn 
     FROM mytable 
     ) 
DELETE 
FROM q 
WHERE rn = 1 

离开这个有没有重复的结果:

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 
+3

这是如何工作它甚至不看分数? – Mark

+0

那也不会删除没有重复的记录吗? – Gavin

+0

不应该由pid分区,按分数排序并删除行号= 2的位置? – Preets

-1

我看不到你的查询,所以我做了这个例子...

SELECT 
    PID, 
    MAX(Score) 
FROM 
    tblTable 
GROUP BY 
    PID 
+0

选择OP希望不删除其他人的那些 – Mark

0

试试这个..

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