【问题标题】:Data step/SQL Join/Merge/Union 2 datasets/tables and remove the same rows/observations数据步骤/SQL 连接/合并/联合 2 数据集/表并删除相同的行/观察
【发布时间】:2013-03-22 04:04:11
【问题描述】:

例如,我有 2 个这样的表

data have;
input name $ status $;
datalines;
A    a
B    b
C    c
;;;;
run;

第二张桌子:

data addon;
input name $ status $;
datalines;
A    a
C    f
D    d
E    e
F    f
B    z
;;;;
run;

我如何得到如下结果:

B    b
C    c
C    f
D    d
E    e
F    f
B    z

行 A - a 与 2 个表相同,因此被删除。我正在尝试使用左连接,但结果不正确。请提前帮助和感谢。我真的很感激。

【问题讨论】:

  • 我有一个适合您的解决方案,但我在尝试提交时收到一条错误消息。这是它的粘贴箱的链接:pastebin.com/ZGnLECuH
  • 如果它是 SAS,你为什么要标记这个 mysql?它们不是同一种语言。您实际上是在 SAS 中还是在 MySQL 中运行它?
  • 对不起,这是我的错误,应该是SQL,因为在SAS中它也接受sql过程。

标签: mysql join union sas datastep


【解决方案1】:

另一种方式

data have;
 input name $ status $;
 datalines;
A    a
B    b
C    c
;;;;
run;

data addon;
 input name $ status $;
datalines;
A    a
C    f
D    d
E    e
F    f
B    z
;;;;
run;

Data Together;
 Set have addon;
 /* If the data sets were already sorted */
 /* By Name Status;                      */
/*  Then skip the Proc Sort              */
Run;

Proc sort data=together;
 by name status;
Run;

Data final;
 Set Together;
 by name status;
 if first.status and last.status;
Run;

【讨论】:

  • 感谢您的帮助。我接受了这个答案,因为它具有最好的性能。再次感谢。
【解决方案2】:

试试这个:

  SELECT COALESCE(table1.input, table2.input) AS input
         , COALESCE(table1.status, table2.status) AS status
    FROM table1
         FULL OUTER JOIN table2 ON table1.input = table2.input
         AND table1.status = table2.status
   WHERE (table1.input IS NULL OR table2.input IS NULL)
ORDER BY 1

输出:

INPUT STATUS
----- ------
B     b      
B     z      
C     f      
C     c      
D     d      
E     e      
F     f      

【讨论】:

    【解决方案3】:

    没有时间对此进行测试,但这大约是正确的。不能在 SQLFiddle 中工作,因为 MySQL 不支持 except。

    select * from (
      select * from have union select * from addon)
    except
    ( select * from have, addon 
       where have.status=addon.status and have.name=addon.name)
    

    【讨论】:

      【解决方案4】:
      SELECT t1.name,t1.status
      FROM 
        (
          SELECT name,status
          FROM have
          UNION ALL
          SELECT name,status
          FROM addon
        ) as t1
      JOIN have t2 ON t1.name!=t2.name AND t1.status!=t2.status
      JOIN addon t3 ON t2.name=t3.name AND t2.status=t3.status
      

      我为你创建了一个SQL fiddle

      【讨论】:

        【解决方案5】:
        data have;
        input name $ status $;
        datalines;
        A    a
        B    b
        C    c
        ;;;;
        run;
        

        第二张桌子:

        data addon;
        input name $ status $;
        datalines;
        A    a
        C    f
        D    d
        E    e
        F    f
        B    z
        ;;;;
        run;
        

        我如何得到如下结果:

        B    b
        C    c
        C    f
        D    d
        E    e
        F    f
        B    z
        

        简单使用合并语句。使用此步骤之前的键对数据集进行排序

        DATA RESULT;
        KEEP H.NAME A.STATUS;
        MERGE HAVE(IN = H) ADDON (IN = A);
        BY NAME;
        RUN;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多