如何用SQL筛选未包含Finance类型的Payment ID对应所有行
解决方案:筛选未包含Finance类型的Payment ID对应的所有行
原数据表
| Payment ID | Type |
|---|---|
| 123 | Fee |
| 123 | Service |
| 123 | Finance |
| 456 | Fee |
| 456 | Service |
预期结果
| Payment ID | Type |
|---|---|
| 456 | Fee |
| 456 | Service |
实现SQL语句
以下提供几种常用实现方式,可根据数据库类型和数据规模选择:
方法1:NOT EXISTS子查询(推荐,性能更优)
检查当前行的Payment ID是否存在对应的Finance类型记录,不存在则保留该行:
SELECT t1.* FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2."Payment ID" = t1."Payment ID" AND t2.Type = 'Finance' );
方法2:NOT IN子查询
先找出所有包含Finance类型的Payment ID,再排除这些ID对应的所有行:
SELECT * FROM your_table WHERE "Payment ID" NOT IN ( SELECT "Payment ID" FROM your_table WHERE Type = 'Finance' );
注意:若子查询返回的Payment ID包含NULL值,NOT IN会导致结果为空,使用时需确保子查询结果无NULL。
方法3:窗口函数(适合大数据量场景)
通过窗口函数统计每个Payment ID下是否包含Finance类型,再筛选统计数为0的行:
SELECT "Payment ID", Type FROM ( SELECT *, COUNT(CASE WHEN Type = 'Finance' THEN 1 END) OVER (PARTITION BY "Payment ID") AS has_finance FROM your_table ) sub_query WHERE has_finance = 0;
内容的提问来源于stack exchange,提问作者Nshalev
相关产品推荐
相关产品推荐

