SQL实现:同一Number存在Type A时忽略对应Type B行
处理Type优先级的数据筛选方案
嘿,这个需求我之前也碰到过,本质就是给每个Number对应的Type设置优先级来筛选记录——当一个Number同时有A和B类型时,只保留A;如果只有单一类型就直接保留。下面一步步给你拆解:
需求明确
- 数据表中
SL是唯一标识,Type仅包含A/B两种类型 - 核心规则:同一
Number同时存在A和B时,忽略B记录;单一类型则保留原记录
原始数据表
SL Number Type 1 101 A 2 102 A 3 102 B 4 103 A 5 104 B
期望结果
SL Number Type 1 101 A 2 102 A 4 103 A 5 104 B
具体实现方案
方案1:SQL实现(以MySQL为例)
最常用的是用窗口函数给每个分组设置优先级,然后筛选优先级最高的记录:
SELECT t.SL, t.Number, t.Type FROM ( SELECT *, -- 给Type设置优先级:A优先级为1,B为2,确保A排在前面 ROW_NUMBER() OVER (PARTITION BY Number ORDER BY CASE WHEN Type = 'A' THEN 1 ELSE 2 END) AS rn FROM your_table_name -- 替换成你的实际表名 ) t WHERE t.rn = 1;
解释:
PARTITION BY Number:把数据按Number分组,每个组内单独处理ORDER BY CASE...:让A类型的记录在组内排在最前面,分配rn=1- 外层筛选
rn=1的记录,就得到了每个Number的目标记录
方案2:Python Pandas实现
如果是用Python处理数据,可以这样写:
import pandas as pd # 构造原始数据(实际场景可以用pd.read_csv等读取) df = pd.DataFrame({ 'SL': [1, 2, 3, 4, 5], 'Number': [101, 102, 102, 103, 104], 'Type': ['A', 'A', 'B', 'A', 'B'] }) # 给Type添加优先级列,A的优先级更高 df['priority'] = df['Type'].map({'A': 1, 'B': 2}) # 按Number分组,取优先级最小的第一条记录 result_df = df.sort_values('priority').groupby('Number').first().reset_index() # 移除辅助的priority列 result_df = result_df.drop('priority', axis=1) # 输出结果 print(result_df)
运行这段代码后,就能得到和期望一致的结果。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

