基于指定条件排除SQL记录:需求说明与数据示例
按规则过滤SQL表记录的解决方案
需求说明
需要排除满足以下条件的记录:
- 同一客户在同一天购买了Shoe和Hat,排除Hat对应的记录
- 同一客户在同一天购买了Shoe和Cloth,排除Cloth对应的记录
示例数据
create table tbl ( Customer varchar(5), Day date, Product varchar(5), Cost decimal(10,2) ); insert into tbl values ('A', '1/1/2019', 'Shoe', 10.00), ('B', '2/4/2021', 'Hat', 10.00), ('B', '5/8/2018', 'Shoe', 10.00), ('C', '6/6/2020', 'Hat', 10.00), ('C', '11/9/2021', 'Cloth', 10.00), ('E', '7/2/2020', 'Hat', 10.00), ('A', '7/5/2022', 'Hat', 10.00), ('C', '6/6/2020', 'Shoe', 10.00), ('A', '1/1/2019', 'Cloth', 10.00), ('E', '7/2/2020', 'Shoe', 10.00);
解决方案SQL
SELECT Customer, Day, Product, Cost FROM ( SELECT *, COUNT(CASE WHEN Product = 'Shoe' THEN 1 END) OVER (PARTITION BY Customer, Day) AS has_shoe FROM tbl ) filtered_data WHERE NOT ( (has_shoe > 0 AND Product = 'Hat') OR (has_shoe > 0 AND Product = 'Cloth') ) ORDER BY Customer, Day;
思路解释
- 内层查询用窗口函数
COUNT() OVER (PARTITION BY Customer, Day),按客户和日期分组,统计每组内购买Shoe的次数,得到has_shoe字段——值大于0表示该客户当天买过Shoe。 - 外层查询过滤掉两种需要排除的记录:
- 当天买过Shoe且当前产品是Hat
- 当天买过Shoe且当前产品是Cloth
预期结果
| Customer | Day | Product | Cost |
|---|---|---|---|
| A | 2019-01-01 | Shoe | 10.00 |
| A | 2022-07-05 | Hat | 10.00 |
| B | 2018-05-08 | Shoe | 10.00 |
| B | 2021-02-04 | Hat | 10.00 |
| C | 2020-06-06 | Shoe | 10.00 |
| C | 2021-11-09 | Cloth | 10.00 |
| E | 2020-07-02 | Shoe | 10.00 |
结果说明
- 客户A在2019-01-01同时购买了Shoe和Cloth,Cloth记录被排除
- 客户C在2020-06-06同时购买了Shoe和Hat,Hat记录被排除
- 客户E在2020-07-02同时购买了Shoe和Hat,Hat记录被排除
- 其余未触发排除条件的记录均保留
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

