如何在SQL中基于多行筛选数据?

3

我希望找到一种过滤两行条件的方法。通常在基本的 SQL 中,可以使用 whereandor 语句来过滤查询。如果我想要在两行之间进行过滤怎么办?例如,在下面的示例中,我想要找到属于这两个组的每个患者。

如果我使用:

select *  from table
where group = group1 and group = group2 

显然这不起作用。

我该如何查询“查找具有两个特定组值的每个患者”?在此示例中,我正在寻找group1group2,因此不应匹配peter,尽管他在两个组中。

 Student
    id | patient | group
    1  | jhon    | group1
    2  | jack    | group1
    3  | jill    | group2
    4  | jack    | group2
    5  | jill    | group1
    6  | peter   | group2
    7  | peter   | group3

期望输出结果(顺序不重要):
 Student
    id | patient | group
    1  | jack    | group1
    2  | jack    | group2
    3  | jill    | group1
    4  | jill    | group2

提到使用“group”作为列名是不好的,这是真的。我想指出这一点,因为我不想改变问题。


尝试使用OR,而不是AND。 - jarlh
@jarlh然后我获取到的是两个群组中任意一个的人,但我想要那些同时参与其中的人。 - mischva11
@mischva11 你使用什么数据库? - VBoka
1
@VBoka 我觉得是Oracle,但我不太确定。实际上,我正在尝试使用SAS进行分析,并且更喜欢使用SQL查询。 - mischva11
3个回答

2
SELECT * 
FROM Student 
WHERE patient IN (
    SELECT s1.patient 
    FROM Student s1
    INNER JOIN Student s2
    ON s2.patient = s1.patient
    AND s2.group = 'group2'
    WHERE s1.group = 'group1'
    )

内部选择不足吗?你已经拥有所有的信息。 - A_kat
@A_kat 不,内部将返回jack和jill,如果你想要ID和组,你必须这样做。 - Joan Lara
1
这个解决方案会抛出错误,因为你需要指定从哪个别名选择病人。 - VBoka
1
@VBoka 是的,我已经添加了它。 - Joan Lara
1
很好,我给你点赞,因为现在错误已经被修复,这将会返回良好的结果:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=4dadf8fbe70d81fd86a116f16b47df52 - VBoka

2

使用count distinctIN运算符:

select * 
from student 
where patient in (select patient
                  from student
                  where group_c in ('group1', 'group2')
                  group by patient
                  having count(distinct group_c) = 2)

这里是SQLServer的演示

P.S. 我将列名group更改为group_c,因为在列名中使用关键字不是一个好习惯。


1
那并没有回答问题。 - Joan Lara
1
嗨 @JoanLaraGanau 謝謝提供的資訊。現在已經可以了。 - VBoka
1
嗨@mischva11,抱歉混淆了“学生/学生”的用词。我已经更改了... 我只是和你同时在编辑,所以我覆盖了你的修改... - VBoka
没问题。我喜欢使用不同计数的解决方案,这似乎受到了@A_kat的启发。使用关键词是不好的,那是真的。谢谢你提醒我,我还是会继续用这样的措辞来提问。否则,现有答案会变得混乱。 - mischva11
1
嗨 @mischva11,实际上这个答案并没有受到那个答案的启发,因为如果你仔细看一下,不仅我使用了IN运算符而不是OR运算符,而且我的结果将返回表student中的所有列,而那个答案(如果正确的话)只会返回列patient。 - VBoka

1
SELECT
 *
FROM (SELECT 
        patient
      FROM Student 
      WHERE group = 'group1' OR group = 'group2'
      GROUP BY patient
      HAVING COUNT(*) = 2) A
INNER JOIN Student ON Student.patient = A.patient

第二个选择是获取其余信息的方式。如果您只需要患者姓名,则内部查询就足够了。请注意,在进行聚合计算之前先进行筛选。

1
但是,@mischva11,如果例如Peter有group1和group1,这是一个好答案吗?我认为不是。 - VBoka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接