2017-03-02 35 views
-1

我有這樣一個表:SQL/SAS:創建不存在的表?

ID GROUP VALUE 
201540 1 1000 
201540 2 1111 
201540 5 2000 
201550 1 200 
201550 8 400 
201610 4 990 
201610 5 400 
201610 6 777 
201610 7 222 
201610 8 6666 

什麼,我需要做的是擴大表,所以每個ID有從1到8 我想創建一個表conaining缺少組8組每個ID,像這樣:

ID GROUP VALUE 
201540 3 -1 
201540 4 -1 
201540 6 -1 
201540 7 -1 
201540 8 -1 
201550 2 -1 
201550 3 -1 
201550 4 -1 
201550 5 -1 
201550 6 -1 
201550 7 -1 
201610 1 -1 
201610 2 -1 
201610 3 -1 

我試着用

CREATE TABLE TMP AS 
SELECT ID, GROUP, -1 from table where not exists 
(SELECT * FROM table where ....) 

但我不知道如何使用where-clause ...

任何提示? 謝謝你,dbdb

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

回答

0

這是我在Oracle中嘗試過的。邏輯是

  1. 生成1-8範圍。 (seq)
  2. 在派生表中獲取不同的ID。 (dist)
  3. 交叉連接上述2個輸出以獲得組和ID的所有可能組合。
  4. 使用此組合並與現有表連接並僅篩選現有表中缺少的那些記錄。你可以用left join來完成。

這是Oracle中的示例代碼。您可以在SAS中使用類似的方法。

with tbl(ID,GRP,VAL) as (
    select 201540,1,1000 from dual union all 
    select 201540,2,1111 from dual union all 
    select 201540,5,2000 from dual union all 
    select 201550,1,200 from dual union all 
    select 201550,8,400 from dual union all 
    select 201610,4,990 from dual union all 
    select 201610,5,400 from dual union all 
    select 201610,6,777 from dual union all 
    select 201610,7,222 from dual union all 
    select 201610,8,6666 from dual) 
    ,seq (seqno) as (
    select 1 from dual union all 
    select 2 from dual union all 
    select 3 from dual union all 
    select 4 from dual union all 
    select 5 from dual union all 
    select 6 from dual union all 
    select 7 from dual union all 
    select 8 from dual) 
    ,all_seq as 
    (select * from seq cross join (select distinct ID from tbl)) 
    select s.id,s.seqno as grp,-1 as val from all_seq s 
    left join tbl t 
    on s.id=t.id and s.seqno=t.grp 
    where t.id is null 

輸出

ID  GRP VAL 
201540 4 -1 
201540 7 -1 
201540 6 -1 
201540 3 -1 
201540 8 -1 
201550 7 -1 
201550 4 -1 
201550 3 -1 
201550 5 -1 
201550 6 -1 
201550 2 -1 
201610 1 -1 
201610 3 -1 
201610 2 -1 
0

如果這是SAS那麼它可能是最容易下來把問題分解成這樣幾個步驟:

  1. 得到,如果所有的獨特列表ID(如果已經有這樣的數據集,請跳過此步驟)

Proc sort data = original out = ID_list nodupkey;
by ID;
run;

  1. 展開ID列表數據集以包含每個ID的所有組。

    data expanded;
    set ID_list;
    do i = 1 to 8;
    group = i;
    value = - 1;
    output;
    end;
    run;

  2. 查找ID *組組合在原始不存在。

    proc sql;
    create table final as
    select L.*
    from expanded as L left join original as R
    on L.ID=R.ID and L.group = R.group
    where not(L.ID = R.ID and L.group = R.group);
    quit;

這應該給你所有的ID *組不存在於原始數據集 - 值1。

+0

非常感謝,是的,它在SAS。您的解決方案適用於我。 – derbestederbesten