Sql 动态创建新列以写入相同id的不同行值
在Teradata Sql中(如果可能的话,也可以在SAS中执行),我尝试为几个字段清除重复项,其中给定ID有多个不同的值。我不想在该列中丢失新的不同值,因此我希望将其作为新列写入。可以有任意数量的不同值,因此它必须动态计算每个不同值,并为每个值编写一个新列。下表为示例:Sql 动态创建新列以写入相同id的不同行值,sql,sas,duplicates,teradata,Sql,Sas,Duplicates,Teradata,在Teradata Sql中(如果可能的话,也可以在SAS中执行),我尝试为几个字段清除重复项,其中给定ID有多个不同的值。我不想在该列中丢失新的不同值,因此我希望将其作为新列写入。可以有任意数量的不同值,因此它必须动态计算每个不同值,并为每个值编写一个新列。下表为示例: ID | V1 | V2 | A | Mike | 25 | A | Mike | 26 | A | Mike | 27 | 致: 这可以在S
ID | V1 | V2 |
A | Mike | 25 |
A | Mike | 26 |
A | Mike | 27 |
致:
这可以在SAS中使用
proc transpose
轻松完成,它将动态创建新列。在这种情况下,您可以将by
变量设置为id
(或id
和V1
的组合)
结果输出如下所示:
Obs id V1 _NAME_ COL1 COL2 COL3
1 A Mike V2 25 30 .
2 B Mark V2 4 . .
3 C Mack V2 23 40 90
有许多其他选项可用于更改文档中输出的名称。如果插入另一行,预期结果是什么?你想突然出现第四列吗?@jarlh是的,我想添加列,直到Mike有了新的ID。谢谢,我会试试这个。我确实忘了提到我有几个专栏需要做这件事。那么我可以在proc转置中使用多个变量吗?是的,您可以使用多个变量。默认情况下,它们将列在
\u NAME\u
变量下。我想我不理解NAME列中的V2。那不应该是迈克,马克,麦克,身份证分别是A,B,C吗?我试过运行这个,有5个变量,SAS EG冻结在我身上。。。将在较小的数据集上进行尝试。@CGermain您可以将by
语句更改为by id v1代码>,它将保留该列。我正在运行这个程序,它将返回column:NAME和我的变量名(在示例中,所有行都将是“V2”,另一个column:LABEL在所有行中也返回“V2”)。
data tmp;
input id $ V1 $ V2;
datalines;
A Mike 25
A Mike 30
B Mark 4
C Mack 23
C Mack 40
C Mack 90
;
run;
proc sort data=tmp;
by id v1;
run;
proc transpose data=tmp out=trans;
by id V1;
var v2;
run;
proc print;
Obs id V1 _NAME_ COL1 COL2 COL3
1 A Mike V2 25 30 .
2 B Mark V2 4 . .
3 C Mack V2 23 40 90