SQL查找重复项

时间:2014-09-16 18:39:47

标签: sql sas

我有一个包含以下列的表,其中包含超过百万行,

ID,姓名

1,拉姆

2,米尔

3,拉姆

4,拉吉

我需要创建列重复,如果2个I​​D具有相同的名称,则指定是。如果不指定NO

ID,姓名,重复

1,羊,是

2,米尔,无

3,拉姆,是的

4,拉吉,无

5 个答案:

答案 0 :(得分:4)

您应按名称对数据进行排序。然后使用第一个命令,la

PROC SORT DATA = mydata;
BY name id;
RUN;

DATA mydata_mod;
SET mydata;
BY name;
IF first.name and last.name THEN duplicate = "No";
ELSE duplicate = "Yes";
RUN;

基本上我们在这里做的是说,“嘿,这个名字在我的数据集中是第一次也是最后一次出现?如果是这样,它不是重复的。如果不是,那就是。” p>

另请注意,您可以稍微修改数据步骤以获取具有重复项的唯一名称:

DATA mydata_mod (KEEP = name);
SET mydata;
BY name;
IF first.name and last.name THEN duplicate = "No";
ELSE duplicate = "Yes";
IF first.name and duplicate = "Yes";
RUN;

我已经使用了几次像后来的DATA步骤那样的逻辑,所以我想继续提及它,以防它有用: - )

答案 1 :(得分:1)

这将为您提供所有重复项的计数。 0表示否和> 0意味着是的。

Select name, count(*) cnt from my_table
group by name;

如果您只想要是和否,请将count()替换为:计数时的情况()> 0然后'是'否则'否'端。

答案 2 :(得分:1)

这是另一个SQL解决方案:

data have;
input ID Name $;
datalines;

1 Ram
2 Meer
3 Ram
4 Raj
;
run;

proc sql;
    create table want as
    select a.ID, a.name, case when count(name)>1 then "YES"
                        when count(name)=1 then "NO"
                        else "CHECK"
                    end as DUP
    from have as a
    group by name
    order by ID;
quit;

答案 3 :(得分:0)

如果您想将它作为另一栏:

SELECT 
    ID, 
    Name,
    CASE 
        WHEN EXISTS(SELECT null FROM MyTable t2 WHERE t2.Name = t.Name AND t2.ID <> t.ID)
        THEN 'Yes'
        ELSE 'No'
    END AS Dups
FROM MyTable t

答案 4 :(得分:0)

select t.id,
       t.name, 
       (case  when A.countval >1 then 'Yes' else 'No' end) as Dups
from
(
select name, COUNT(*) as countval
from t
group by name
)A
inner join t
on A.name = t.name