首页 > 解决方案 > 按 id 和某些条件过滤掉数据分组

问题描述

我有一个使用 Sql 获取数据的要求,如下所示

someid  | passengertype  | somename |
--------+----------------+-----------
123     | 3              | abc      |
123     | 6              | zxc      |
111     | 4              | qwe      |
111     | 6              | poi      |
222     | 2              | lkj      |
563     | 1              | uyt      |
563     | 2              | mnb      |
563     | 6              | oiu      |

我只想选择按 someid 分组的记录,其中乘客类型不是 3 和 6。即,如果乘客类型仅包含 3 或 6,则无论何时对于 someid 都不要选择该 ID,如果其他乘客 ID 存在 3 或 6,则选择该 ID。所需的输出应该是:

someid  | passengertype  | somename |
--------+----------------+-----------
111     | 4              | qwe      |
111     | 6              | poi      |
222     | 2              | lkj      |
563     | 1              | uyt      |
563     | 2              | mnb      |
563     | 6              | oiu      |

标签: sqlgroup-byhaving-clause

解决方案


您可以使用not exists. . . 两次:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.someid = t.someid and t2.passengertype = 3
                 ) or
      not exists (select 1
                  from t t2
                  where t2.someid = t.someid and t2.passengertype = 6
                 ) ;

如果您只想要someid满足此条件的值,那么聚合将是合适的:

select someid
from t
group by someid
having sum(case when passengertype = 3 then 1 else 0 end) = 0 or
       sum(case when passengertype = 6 then 1 else 0 end) = 0;

推荐阅读