我有张像这样的桌子
|=========|=====|==================|==============|===========|===========|
| PREFIX | ID | PREVIOUS_PREFIX | PREVIOUS_ID | VENDOR_1 | VENDOR_2 |
|=========|=====|==================|==============|===========|===========|
| A | 1 | | | JAC | BOA |
|---------|-----|------------------|--------------|-----------|-----------|
| B | 2 | C | 99 | LCH | GS |
|---------|-----|------------------|--------------|-----------|-----------|
| B | 3 | C | 99 | LCH | JPM |
|---------|-----|------------------|--------------|-----------|-----------|我需要把它变成这样的桌子
|=========|=====|==================|==============|===========|===========|
| PREFIX | ID | PREVIOUS_PREFIX | PREVIOUS_ID | VENDOR_1 | VENDOR_2 |
|=========|=====|==================|==============|===========|===========|
| A | 1 | | | JAC | BOA |
|---------|-----|------------------|--------------|-----------|-----------|
| C | 99 | | | GS | JPM |
|---------|-----|------------------|--------------|-----------|-----------|这就是:
PREVIOUS_PREFIX和PREVIOUS_ID的行,它将该行保留为PREVIOUS_PREFIX和PREVIOUS_ID的行:PREFIX与PREVIOUS_PREFIX相同,ID与PREVIOUS_ID相同,VENDOR_1和VENDOR_2是原始行不常见的供应商。
发布于 2015-07-07 06:02:03
/* Create sample data */
data have;
input Prefix $ ID Previous_Prefix $ Previous_ID Vendor_1 $ Vendor_2 $;
cards;
A 1 . . JAC BOA
B 2 C 99 LCH GS
B 3 C 99 LCH JPM
E 5 F 52 LOK U
E 5 F 52 LOK M
;;;
run;
/* Assign new values for Prefix & ID */
data want;
set have;
if Previous_Prefix ne '' then do;
Prefix = Previous_Prefix;
Previous_Prefix = '';
end;
if Previous_ID ne . then do;
ID = Previous_ID;
Previous_ID = .;
end;
run;
/* Merge Vendor_1 & Vender2 into one column */
data want2;
set want;
if first.ID then n = 0;
n + 1;
by ID notsorted;
run;
proc transpose data=want2 out=want3(drop=n _NAME_ rename=(COL1=Vendor));
by Prefix ID n Previous_Prefix Previous_ID;
var Vendor_1 Vendor_2;
run;
/* Delete common Vendor_ */
proc sort data=want3;by Prefix ID Previous_Prefix Previous_ID Vendor;run;
proc summary data=want3;
output out=want4(where=(_freq_ = 1));
by Prefix ID Previous_Prefix Previous_ID Vendor notsorted;
run;
/* Transpose data from long back to wide */
proc transpose data=want4 out=want5(drop=_:) prefix=Vendor_;
var Vendor;
by Prefix ID Previous_Prefix Previous_ID notsorted;
run;发布于 2015-07-07 06:44:25
一个稍微简单的解决方案是将单个观察扩展为2个观察,并将供应商合并到单变量中,并将previous_prefix和前缀合并到一起,以获得new_prefix和类似的id。按此顺序获取数据可以解决单个sql中的问题。看看这个草案代码。
DATA WANT;
SET HAVE;
PREFIX_NEW =COALESCEC(PREVIOUS_PREFIX,PREFIX);
ID_NEW =COALESCEC(PREVIOUS_ID ,ID);
IF NOT MISSING(VENDOR_1) THEN VENDOR=VENDOR_1;
OUTPUT;
IF NOT MISSING(VENDOR_2) THEN VENDOR=VENDOR_2;
OUTPUT;
RUN;
PROC SQL;
SELECT PREFIX_NEW
, ID_NEW
, MIN(VENDOR) AS VENDOR_1
, MAX(VENDOR) AS VENDOR_2
FROM ( SELECT PREFIX_NEW
, ID_NEW
, VENDOR
, COUNT(*) AS COUNTER
FROM WANT
GROUP BY 1,2,3
HAVING COUNTER=1
)
;
QUIT;希望这会有帮助!
https://stackoverflow.com/questions/31259475
复制相似问题