如何编写脚本在单表不同列检索相同值并匹配对应order_id
电话号码两类检索需求实现方案
现有业务表包含tel1、tel2、tel3三个电话号码存储字段,以及order_id订单编号字段,以下分别给出两类需求的实现方式,覆盖SQL查询、Python脚本两种常用场景。
需求1:识别不同tel列中存储的重复相同电话号码
核心逻辑是将三列独立存储的电话号码打平为单列,统计每个号码的出现次数,筛选出出现2次及以上的重复值,同时关联对应的订单信息。
SQL实现(以MySQL为例)
WITH all_tel_record AS ( SELECT tel1 AS tel_number, order_id FROM 你的表名 WHERE tel1 IS NOT NULL UNION ALL SELECT tel2 AS tel_number, order_id FROM 你的表名 WHERE tel2 IS NOT NULL UNION ALL SELECT tel3 AS tel_number, order_id FROM 你的表名 WHERE tel3 IS NOT NULL ) SELECT tel_number AS 重复电话号码, COUNT(DISTINCT order_id) AS 关联订单总数, GROUP_CONCAT(DISTINCT order_id SEPARATOR ',') AS 匹配的所有order_id FROM all_tel_record GROUP BY tel_number HAVING COUNT(*) >= 2;

Python pandas脚本实现
import pandas as pd # 替换为你自己的数据读取逻辑,支持读csv、excel、数据库查询结果等 df = pd.read_excel("你的数据表路径.xlsx") # 行转列打平三列tel数据 tel_unpivot = df.melt( id_vars=['order_id'], value_vars=['tel1', 'tel2', 'tel3'], var_name='存储字段', value_name='电话号码' ).dropna(subset=['电话号码']) # 筛选重复号码及关联订单 repeat_result = tel_unpivot.groupby('电话号码').agg( 关联订单数=('order_id', 'nunique'), 关联订单列表=('order_id', lambda x: sorted(x.unique().tolist())) ).query("关联订单数 >= 2").reset_index()
需求2:指定目标电话号码,查询该号码匹配的所有order_id
核心逻辑是匹配三个tel列,只要目标号码在任意一列出现,就提取对应的order_id去重返回。以查询号码65432100为例,最终返回匹配的order_id为1、3、5。
SQL实现(以MySQL为例)
-- 将WHERE条件中的号码替换为你需要检索的目标值即可 SELECT DISTINCT order_id FROM 你的表名 WHERE tel1 = '65432100' OR tel2 = '65432100' OR tel3 = '65432100';

Python pandas脚本实现
# 替换为需要检索的目标电话号码 target_tel = '65432100' # 筛选匹配的订单 match_order_ids = df[ (df['tel1'] == target_tel) | (df['tel2'] == target_tel) | (df['tel3'] == target_tel) ]['order_id'].sort_values().unique().tolist()
内容的提问来源于stack exchange,提问作者RAYMOND Yeung
相关产品推荐
相关产品推荐

