如何区分 SAS SQL 中的一列和所有列

问题描述 投票:0回答:5

[在此输入图像描述]

1

对于下表中的示例,我需要具有相同名称和 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
sql sas
5个回答
3
投票

使用 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

1
投票

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

1
投票

我推荐

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);

1
投票

好的,一种方法是使用窗口函数

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

0
投票

如果您在 SAS 中执行此操作,只需使用

proc sort

proc sort data=have out=want nodupkey;
    by name id;
run;
© www.soinside.com 2019 - 2024. All rights reserved.