我有一个类似的数据集:
Col1 Col2
1 ABC
2 DEF
3 ABC
1 DEF
预期输出:
Col1 Col2
1 ABC
1 DEF
我只想从Col1中提取在列中同时具有值ABC
和DEF
的那些IDS。
我在SQL中尝试过self-join
,但是并没有达到预期的结果。
SELECT DISTINCT Col1
FROM db A, db B
WHERE A.ID <> B.ID
AND A.Col2 = 'ABC'
AND B.Col2 = 'DEF'
GROUP BY A.Col1
此外,我尝试使用以下代码在R中进行同样的操作:
vc <- c("ABC", "DEF")
data1 <- db[db$Col2 %in% vc,]
同样,我没有得到想要的输出。感谢所有提前提供的指针。
答案 0 :(得分:6)
在R中,您可以
library(dplyr)
df %>%
group_by(Col1) %>%
filter(all(vc %in% Col2))
# Col1 Col2
# <int> <fct>
#1 1 ABC
#2 1 DEF
相当于Base R的
df[as.logical(with(df, ave(Col2, Col1, FUN = function(x) all(vc %in% x)))), ]
# Col1 Col2
#1 1 ABC
#4 1 DEF
我们选择其中包含所有vc
的组。
答案 1 :(得分:5)
这是您当前的查询已更正:
SELECT DISTINCT t1.Col1
FROM yourTable t1
INNER JOIN yourTable t2
ON t1.Col1 = t2.Col1
WHERE t1.Col2 = 'ABC' AND t2.Col2 = 'DEF';
连接条件是两个Col1
值都是 same ,第一个Col2
值是ABC
,第二个Col2
值是DEF
。
但是,我可能会使用以下规范方法:
SELECT Col1
FROM yourTable
WHERE Col2 IN ('ABC', 'DEF')
GROUP BY Col1
HAVING MIN(Col2) <> MAX(Col2);
答案 2 :(得分:0)
使用相关子查询:
select * from tablename t
where exists (select 1 from tablename t1 where t1.col1=t.col1 and col2 in ('ABC','DEF')
group by col1 having count(distinct col2)=2)
答案 3 :(得分:0)
这是使用group_concat的一种方式
select t.Col1,t.col2
from t
join
(
select col1,group_concat(distinct col2 order by col2) gc
from t
group by col1 having gc = 'abc,def'
) s
on s.col1 = t.col1;
+------+------+
| Col1 | col2 |
+------+------+
| 1 | ABC |
| 1 | DEF |
+------+------+
2 rows in set (0.16 sec)
但是您必须了解col2的顺序
答案 4 :(得分:0)
在R
中,我们也可以使用data.table
library(data.table)
setDT(df)[, .SD[all(vc %in% Col2)], by = col1]