我有一个看起来像这样的数据集:
Col1 Col2
1 ABC
2 DEF
3 ABC
1 DEF
Run Code Online (Sandbox Code Playgroud)
预期产量:
Col1 Col2
1 ABC
1 DEF
Run Code Online (Sandbox Code Playgroud)
我想只从Col1中提取那些同时具有值ABC和DEF列的IDS .
我self-join在SQL中尝试了但是没有给我预期的结果.
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
Run Code Online (Sandbox Code Playgroud)
另外,我在R中使用以下代码尝试了同样的事情:
vc <- c("ABC", "DEF")
data1 <- db[db$Col2 %in% vc,]
Run Code Online (Sandbox Code Playgroud)
再一次,我没有得到所需的输出.感谢所有指针提前.
在R中,你可以做到
library(dplyr)
df %>%
group_by(Col1) %>%
filter(all(vc %in% Col2))
# Col1 Col2
# <int> <fct>
#1 1 ABC
#2 1 DEF
Run Code Online (Sandbox Code Playgroud)
基准R相当于
df[as.logical(with(df, ave(Col2, Col1, FUN = function(x) all(vc %in% x)))), ]
# Col1 Col2
#1 1 ABC
#4 1 DEF
Run Code Online (Sandbox Code Playgroud)
我们选择包含所有内容的组vc.
这是您当前的查询更正:
SELECT DISTINCT t1.Col1
FROM yourTable t1
INNER JOIN yourTable t2
ON t1.Col1 = t2.Col1
WHERE t1.Col2 = 'ABC' AND t2.Col2 = 'DEF';
Run Code Online (Sandbox Code Playgroud)
连接条件是两个Col1值都相同,第一个Col2值是ABC,第二个Col2值是DEF.
但是,我可能会使用以下规范方法:
SELECT Col1
FROM yourTable
WHERE Col2 IN ('ABC', 'DEF')
GROUP BY Col1
HAVING MIN(Col2) <> MAX(Col2);
Run Code Online (Sandbox Code Playgroud)