基于特定字段删除重复项的SQL语句

时间:2017-03-27 21:24:13

标签: sql sql-server duplicates

我有一个名为people的表,它看起来像这样:

Name    Type    Amount
allen   admin   300
brandon admin   150
brandon mrr     25
jared   admin   225
john    mrr     30
john    admin   500
tyler   admin   245

如果Name值的Type值为'admin'和'mrr',我想使用SQL只保留Name的'mrr'值所以我的结果输出如下所示:

Name    Type    Amount
allen   admin   300
brandon mrr     25
jared   admin   225
john    mrr     30
tyler   admin   245

我在SQL Server工作。提前谢谢。

1 个答案:

答案 0 :(得分:1)

一种方法是选择所有mrrs,然后只选择不匹配的管理员:

select p.*
from people p
where p.type = 'mrr'
union all
select p.*
from people p
where p.type = 'admin' and
      not exists (select 1 from people p2 where p2.name = p.name and p2.type = 'mrr');

以上通常是相当有效的。但也可以使用窗口函数:

select p.*
from (select p.*,
             row_number() over (partition by p.name order by charindex(p.type, 'mrr,admin')
                               ) as seqnum
      from people p
     ) p
where seqnum = 1;

charindex()只是按顺序放置值的简便方法。您也可以使用case表达式,但输入的时间要长得多。