db2 合并/分组SAS中的数据

omvjsjqw  于 2023-10-18  发布在  DB2
关注(0)|答案(1)|浏览(187)

我有以下数据集
| ID|网|typ| cust|步|焦油|项目|项目后缀|部分|线|dtn_cd|地质构造|签署|
| --|--|--|--|--|--|--|--|--|--|--|--|--|
| 10 |ARF| 3 | 2585 | 12 | 100 | 4587 | 800 | 1 | 1 | 1 |ZL-23|+的|
| 10 |ARF| 3 | 2585 | 12 | 100 | 4587 | 800 | 1 | 2 | 1 |ZL-US-22|- -一种|
| 10 |ARF| 3 | 2585 | 12 | 100 | 4587 | 800 | 1 | 3 | 1 |ZL-JP-22|+的|
| 10 |ARF| 3 | 2585 | 12 | 100 | 4587 | 800 | 1 | 4 | 2 |ZL-US-44|+的|
| 10 |ARF| 3 | 2585 | 12 | 100 | 4587 | 800 | 1 | 5 | 2 |ZL-US-66|+的|
| 10 |ARF| 3 | 2585 | 12 | 100 | 4587 | 800 | 2 | 1 | 1 |AP-TN-44|+的|
| 10 |ARF| 3 | 2585 | 12 | 100 | 4587 | 800 | 2 | 2 | 2 |AP-TN-22|- -一种|
| 10 |ARF| 3 | 2585 | 12 | 100 | 4587 | 800 | 3 | 1 | 3 |PQ-AR-44|+的|
| 10 |ARF| 3 | 2585 | 12 | 100 | 4587 | 800 | 3 | 2 | 4 |PQ-AR-22|- -一种|
| 50 |PFP| 3 | 3000 | 12 | 100 | 9999 | 899 | 1 | 1 | 1 |DE-NN-44|+的|
| 50 |PFP| 3 | 3000 | 12 | 100 | 9999 | 899 | 1 | 2 | 2 |DE-NN-22|- -一种|
| 50 |PFP| 3 | 3000 | 12 | 100 | 9999 | 899 | 1 | 1 | 3 |HK-DC-44|- -一种|
| 50 |PFP| 3 | 3000 | 12 | 100 | 9999 | 899 | 1 | 2 | 4 |HK-DC-22|+的|
我想要以下输出

我尝试了以下代码,但它不能正常工作

data table_A;
set table_A;
merge
table_A (where= (DCTN_CD = '1') rename=(GEO_CON=FROM_GEO))
table_A (where= (DCTN_CD = '2') rename=(GEO_CON=TO_GEO))
table_A (where= (DCTN_CD = '3') rename=(GEO_CON=BETWEEN_GEO))
table_A (where= (DCTN_CD = '4') rename=(GEO_CON=AMONGST_GEO))
run;

知道怎么做吗我愿意接受SAS或PROC SQL(DB2)的建议。

jyztefdp

jyztefdp1#

您需要计算两个合成值:

  • line_group,对于部件内有多个线组的情况,以及
  • dtn seq,以强制执行原始排序。

然后,您可以通过line_group和dtn_seq进行合并。
范例:

data have;
input
Id  com$ typ cust  bu  tar item  item_sufx part  line  dtn_cd$ geo_con$ sign$ group; format _numeric_ 4.;
datalines;
10  ARF 3 2585  12  100 4587  800 1 1 1 ZL-UK-23  +  1
10  ARF 3 2585  12  100 4587  800 1 2 1 ZL-US-22  -  2
10  ARF 3 2585  12  100 4587  800 1 3 1 ZL-JP-22  +  3
10  ARF 3 2585  12  100 4587  800 1 4 2 ZL-US-44  +  1
10  ARF 3 2585  12  100 4587  800 1 5 2 ZL-US-66  +  2
10  ARF 3 2585  12  100 4587  800 2 1 1 AP-TN-44  +  4
10  ARF 3 2585  12  100 4587  800 2 2 2 AP-TN-22  -  4
10  ARF 3 2585  12  100 4587  800 3 1 3 PQ-AR-44  +  5
10  ARF 3 2585  12  100 4587  800 3 2 4 PQ-AR-22  -  5
50  PFP 3 3000  12  100 9999  899 1 1 1 DE-NN-44  +  6
50  PFP 3 3000  12  100 9999  899 1 2 2 DE-NN-22  -  6
50  PFP 3 3000  12  100 9999  899 1 1 3 HK-DC-44  -  7
50  PFP 3 3000  12  100 9999  899 1 2 4 HK-DC-22  +  7
;

data have_grouped;
  set have;
  by id com typ cust bu tar item item_sufx part dtn_cd;
  
  line_decreased = line < lag(line) ;
  
  if first.part or line_decreased then line_group+1;
  if first.dtn_cd then dtn_seq=1; else dtn_seq+1;
run;

data want;
  set have_grouped;
  merge
    have_grouped (where= (DTN_CD = '1') rename=(GEO_CON=FROM_GEO SIGN=SIGN_FROM))
    have_grouped (where= (DTN_CD = '2') rename=(GEO_CON=TO_GEO   SIGN=SIGN_TO))
    have_grouped (where= (DTN_CD = '3') rename=(GEO_CON=BETWEEN_GEO SIGN=SIGN_BTWN))
    have_grouped (where= (DTN_CD = '4') rename=(GEO_CON=AMONGST_GEO SIGN=SIGN_AMNG))
  ;
  by line_group dtn_seq;
run;

你可能会得到一个关于数据不按顺序的错误(因为where=不是required来以任何特定顺序传递行)。如果发生这种情况,您将需要合并四个按line_group dtn_seq顺序传递数据的排序视图。

相关问题