数据步骤/SQL 连接/合并/联合 2 数据集/表并删除相同的行/观察
Posted
技术标签:
【中文标题】数据步骤/SQL 连接/合并/联合 2 数据集/表并删除相同的行/观察【英文标题】:Data step/SQL Join/Merge/Union 2 datasets/tables and remove the same rows/observations 【发布时间】: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过程。 【参考方案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;
【讨论】:
以上是关于数据步骤/SQL 连接/合并/联合 2 数据集/表并删除相同的行/观察的主要内容,如果未能解决你的问题,请参考以下文章