【问题标题】:Dynamically create new column to write distinct row values for same id动态创建新列以写入相同 id 的不同行值
【发布时间】:2018-04-15 01:06:14
【问题描述】:

在 Teradata Sql 中(如果可能,也可以在 SAS 中执行)我试图根除给定 ID 有多个不同值的几个字段的重复项。我不想丢失该列中新的不同值,因此我想将其写为新列。可能有任意数量的不同值,因此它必须动态计算每个不同的值并为每个不同的值写入一个新列。下面是表格示例:

 ID |   V1    |    V2   |
 A  |  Mike   |    25   |
 A  |  Mike   |    26   |
 A  |  Mike   |    27   |

收件人:

 ID |   V1    |  V2  | V2.1 | V2.2 |
 A  |  Mike   |  25  |  26  |  27  |

【问题讨论】:

  • 如果插入另一个 Mike 行,预期的结果是什么?你想让第四列突然出现吗?
  • @jarlh 是的,我想添加列,直到 Mike 成为新的“ID”

标签: sql sas duplicates teradata


【解决方案1】:

这可以在 SAS 中使用 proc transpose 轻松完成,这将动态创建新列。在这种情况下,您将by 变量设置为id(或idV1 的组合)。

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

还有很多其他选项可用于更改文档中的输出名称。

【讨论】:

  • 谢谢,我会试试这个。我确实忘记提及我需要为此做的一些专栏。那么我可以在 proc transpose 中使用多个 var 吗?
  • 是的,您可以使用多个变量。默认情况下,它们将列在_NAME_ 变量下。
  • 我想我不理解 NAME 列中的 V2。那不应该是迈克,马克,麦克分别作为ID A,B,C吗?我确实尝试过运行它,有 5 个变量和 SAS EG 冻结在我身上……将尝试使用更小的数据集。
  • @CGermain 您可以将by 语句更改为by id v1;,它将保留该列
  • 我正在运行它,它返回列:NAME 和我的变量名(在示例中,所有行都是“V2”,另一列:LABEL 在所有行中也返回“V2”。
猜你喜欢
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多