按条件分组和删除行

cetgtptt  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(266)

我在博士后有下表。

col1    col2             col3
1       Other            a
2       Drug             b    
1       Procedure        c
3       Combination Drug d
4       Biological       e
3       Behavioral       f
3       Drug             g
5       Drug             g
6       Procedure        h

我想根据以下条件选择行。

select * from table where col2 in ('Other', 'Drug', 'Combination Drug', 'Biological')
order by col1

这是给我下面的输出。

col1    col2             col3
1       Other            a
2       Drug             b    
3       Combination Drug d
3       Drug             g
4       Biological       e
5       Drug             g

但是上面的筛选器不包括下面的行,并且包括具有col1 id(1,3)的行,这些行与“procedure”和“behavious”关联

1       Procedure        c
3       Behavioral       f

但是,我还要排除与它们相关联的其他行

1       Other            a
3       Combination Drug d
3       Drug             g

我找不到解决这个问题的办法。非常感谢您的帮助。谢谢

w6lpcovy

w6lpcovy1#

我想你在找 not exists :

select t.*
from mytable t
where not exists (
    select 1 
    from mytable t1
    where t1.col1 = t.col1 and t1.col2 not in ('Other', 'Drug', 'Combination Drug', 'Biological')
)

db小提琴演示:

col1 | col2       | col3
---: | :--------- | :---
   2 | Drug       | b   
   4 | Biological | e   
   5 | Drug       | g

您还可以使用窗口功能:

select (t.t).*
from (
    select 
        t,
        bool_and(col2 in ('Other', 'Drug', 'Combination Drug', 'Biological'))
            over(partition by col1) flag
    from mytable t
) t
where flag

相关问题