sql - 按 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 |
解决方案
您可以使用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;
推荐阅读
- python - Python中使用Condition对象的线程间通信
- spring-webflux - 由于不支持的媒体类型,无法在 ExceptionHandler 中获取 ServerRequest 的正文
- testing - 如何通过重定向在 testcafe 中设置 Cookie?
- node.js - 更新 URL 时,数据应该在前端过滤还是在后端过滤?
- pandas - 来自uproot的熊猫数据框中的字符串
- python - Celery SQS 任务失败后不会执行
- php - 由于奇怪的版本错误,无法在 macOS Catalina 上安装 PHP 7.3
- html - 通过 p 标签中的 xslt i 标签将 xml 转换为 html
- python - 无法使用 openpyxl 写入输出 excel 文件
- elasticsearch - 如何从 ElasticSearch 中检索脚本字段以及其他字段