1

次の値を含む1つのステージテーブル' STAGE_TABLE'があります(列はIDを除くvarchar2です)-

+-------------------------------------------------------------------------------------------------------------------------
¦  STAGE_ID ¦ EMP_ID     ¦ ATTR1_OLD_VAL ¦ ATTR1_NEW_VAL ¦ ATTR2_OLD_VAL ¦ ATTR2_NEW_VAL ¦ ATTR3_OLD_VAL ¦ ATTR3_NEW_VAL ¦
¦-----------+------------+---------------+---------------+---------------+---------------+---------------+---------------¦
¦         1 ¦       E001 ¦ xyz           ¦ pqr           ¦ mmm           ¦ nnn           ¦ zzz           ¦ aaa           ¦
¦         2 ¦       E001 ¦               ¦               ¦               ¦               ¦               ¦               ¦
¦         3 ¦       E001 ¦ pqr           ¦ abc           ¦ xxx           ¦ yyy           ¦               ¦               ¦
¦         4 ¦       E002 ¦ aaa           ¦ ccc           ¦ bbb           ¦ ttt           ¦               ¦               ¦
¦         5 ¦       E002 ¦               ¦               ¦               ¦               ¦ fff           ¦ ppp           ¦
¦         6 ¦       E002 ¦               ¦               ¦ kkk           ¦ jjj           ¦               ¦               ¦
+-------------------------------------------------------------------------------------------------------------------------

同じ従業員に属する上記のテーブルの複数の行を1つにマージしたい-

+-------------------------------------------------------------------------------------------------------------
¦ EMP_ID     ¦ ATTR1_OLD_VAL ¦ ATTR1_NEW_VAL ¦ ATTR2_OLD_VAL ¦ ATTR2_NEW_VAL ¦ ATTR3_OLD_VAL ¦ ATTR3_NEW_VAL ¦
¦------------+---------------+---------------+---------------+---------------+---------------+---------------¦
¦       E001 ¦ pqr           ¦ abc           ¦ xxx           ¦ yyy           ¦ zzz           ¦ aaa           ¦
¦       E002 ¦ aaa           ¦ ccc           ¦ kkk           ¦ jjj           ¦ fff           ¦ ppp           ¦
+-------------------------------------------------------------------------------------------------------------

私はMERGEステートメントについて知りましたが、それが機能するかどうかはわかりません。oracle pl/sqlは初めてです。

4

2 に答える 2

3
CREATE TABLE tmp 
  ( 
     row_id NUMBER, 
     id     NUMBER, 
     t1     VARCHAR2(5), 
     t2     VARCHAR2(5), 
     t3     VARCHAR2(5) 
  ); 

INSERT INTO tmp 
VALUES      (1, 
             1, 
             'a', 
             NULL, 
             'a'); 

INSERT INTO tmp 
VALUES      (2, 
             1, 
             NULL, 
             'b', 
             'b'); 

INSERT INTO tmp 
VALUES      (3, 
             1, 
             'c', 
             NULL, 
             NULL); 

INSERT INTO tmp 
VALUES      (1, 
             2, 
             'a', 
             'a', 
             NULL); 

INSERT INTO tmp 
VALUES      (2, 
             2, 
             NULL, 
             'b', 
             NULL); 

したがって、1,C,B,B と 2,A,B,NULL を取得する必要があります。

select id_merged, T1,T2,T3 from 
( SELECT id id_merged,
 first_value(T1 IGNORE nulls) over (partition BY id ORDER BY row_id DESC) T1,
 first_value(T2 IGNORE nulls) over (partition BY id ORDER BY row_id DESC) T2,
 first_value(T3 IGNORE nulls) over (partition BY id ORDER BY row_id DESC) T3,
 rank () over (partition by id order by row_id) rn
FROM tmp)
where rn=1 ORDER BY id_merged;
于 2013-01-15T11:38:47.650 に答える
0

を使用して、次を使用group by emp_idして属性の値を選択できますkeep dense_rank

select 
  emp_id,
  max(ATTR1_OLD_VAL) keep (dense_rank first order by decode(ATTR1_OLD_VAL,null,1,0), stage_id desc) as ATTR1_OLD_VAL
from STAGE_TABLE
group by emp_id;

order by decode(ATTR1_OLD_VAL,null,1,0)null 値を末尾に配置します。null 以外の値を持つものから、 で最新のものを選択しますstage_id desc

他の属性を配置する必要がある単一の属性を配置しました。

于 2013-01-15T11:30:44.953 に答える