我有一个包含以下列的表,其中包含超过百万行,
ID,姓名
1,拉姆
2,米尔
3,拉姆
4,拉吉
我需要创建列重复,如果2个ID具有相同的名称,则指定是。如果不指定NO
ID,姓名,重复
1,羊,是
2,米尔,无
3,拉姆,是的
4,拉吉,无
答案 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