[在此输入图像描述]
对于下表中的示例,我需要具有相同名称和 ID 以及不同代码的输出
Name ID Code
Tom 1 155
Tom 1 165
Tom 2 166
Tom 2 166
Tom 3 128
Tom 4 999
以下是所需的输出
Name ID Code
Tom 1 155
Tom 1 165
使用 GROUP BY 和 HAVING。
首先让我们将示例列表转换为实际的数据集。
data have;
input Name $ ID Code;
cards;
Tom 1 155
Tom 1 165
Tom 2 166
Tom 2 166
Tom 3 128
Tom 4 999
;
因此按 NAME 和 ID 进行分组,并且仅保留有多个不同 CODE 值的情况。
proc sql;
create table want as
select *
from have
group by name,id
having count(distinct code) > 1
;
quit;
结果:
Obs Name ID Code
1 Tom 1 165
2 Tom 1 155
按
Name
和 ID
对行进行分区,然后查找每个分区中 MIN(Code)
和 MAX(Code)
的内容。如果它们不同,那就是您想要的。
WITH
partitioned
AS
(
SELECT
yourTable.*,
MIN(Code) OVER (PARTITION BY Name, Code) AS MinCode,
MAX(Code) OVER (PARTITION BY Name, Code) AS MaxCode
FROM
yourTable
)
SELECT
*
FROM
partitioned
WHERE
MinCode <> MaxCode
我推荐
exists
:
select t.*
from t
where exists (select 1
from t t2
where t2.name = t.name and t2.id = t.id and t2.code <> t.code
);
作为奖励,它与
proc sql
兼容。
为了性能,您可以创建索引:
proc sql;
create index idx_t_name_id_code on t(name, id, code);
好的,一种方法是使用窗口函数
select Name, Id, Code
from (
select * , row_number() over (partition by Name,Id,Code order by code desc) rn
from table
) t
where t.rn > 1
如果您在 SAS 中执行此操作,只需使用
proc sort
。
proc sort data=have out=want nodupkey;
by name id;
run;