【问题标题】:Merge multiple rows into one?将多行合并为一行?
【发布时间】:2012-12-29 11:17:19
【问题描述】:

我有一个阶段表“STAGE_TABLE”,其中包括以下值(列是 varchar2,id 除外)-

+-------------------------------------------------------------------------------------------------------------------------
¦  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           ¦               ¦               ¦
+-------------------------------------------------------------------------------------------------------------------------

我想将上表中属于同一员工的多行合并为一个-

+-------------------------------------------------------------------------------------------------------------
¦ 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 的新手。

【问题讨论】:

  • “合并”是什么意思?根据给定的数据,您的结果是什么?
  • 因为我将多列中的数据合并到单行中。
  • 要理解您的问题:为什么 ATTR1_OLD_VAL = pqr 而不是 xyz?因为 STAGE_ID=3 > STAGE_ID=1 ?
  • 是的...考虑阶段表是一个日志表。 stage id 表示唯一的日志 id。如果值为空,则表示现在对给定属性进行了更改。

标签: sql oracle plsql oracle11g plsqldeveloper


【解决方案1】:

您可以使用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) 将空值放在末尾。从具有非空值的那些中选择最新的stage_id desc

我放了一个你应该放其他属性的属性。

【讨论】:

    【解决方案2】:
    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;
    

    【讨论】:

    • +1 提供简洁明了的解决方案! @Parag 显然必须partition by EMP_ID ORDER BY stage_id)。你为什么ORDER BY id_merged
    • 我按顺序进行订购,因为当我检查我的解决方案时会更容易。 :p
    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多