You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:39:56