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

如何在BigQuery中按用户规则处理重复手机号数据

处理BigQuery中重复手机号数据:同一用户去重,不同用户保留

需求:同一手机号由不同用户录入时全部保留,同一用户录入的重复手机号仅保留一条。

原始数据示例

iduser_idphone_numbercreated_atoutlet_id
1R00047891502022-10-10T15:58:511231
2R00057891502022-06-21T11:44:181458
3R00067891502023-01-30T20:08:451587
5R00075073712022-03-31T15:21:491001
6R00075073712022-03-31T15:21:521001

期望结果数据

iduser_idphone_numbercreated_atoutlet_id
1R00047891502022-10-10T15:58:511231
2R00057891502022-06-21T11:44:181458
3R00067891502023-01-30T20:08:451587
5R00075073712022-03-31T15:21:491001

规则说明:手机号789150由不同用户录入,全部保留;手机号507371由同一用户录入,仅保留一条。

原SQL问题

原SQL按手机号分组取最大ID,会过滤掉同一手机号不同用户的记录,不符合需求:

select 
distinct ll.id 
,ll.user_id
,ll.phone_number
,ll.created_at
,ll.outlet_id
from `my_table` ll
where ll.id  in (select max(id) from my_table group by phone_number)
and ll.phone_number in ('+62-8999789150','+62-8999507371')
order by 3 desc

正确SQL语句

使用窗口函数ROW_NUMBER()按用户ID+手机号分组排序,保留每组第一条记录:

WITH ranked_data AS (
  SELECT
    id,
    user_id,
    phone_number,
    created_at,
    outlet_id,
    -- 按user_id和phone_number分组,按created_at升序取最早记录,也可换id升序
    ROW_NUMBER() OVER (PARTITION BY user_id, phone_number ORDER BY created_at ASC) AS row_num
  FROM `my_table`
  WHERE phone_number IN ('+62-8999789150','+62-8999507371')
)
SELECT
  id,
  user_id,
  phone_number,
  created_at,
  outlet_id
FROM ranked_data
WHERE row_num = 1
ORDER BY phone_number DESC;

逻辑说明

  • PARTITION BY user_id, phone_number:将数据按用户ID和手机号分组,确保同一用户同一手机号的记录在同一组内
  • ORDER BY created_at ASC:每组内按创建时间升序排序,保留最早录入的记录;若想保留最新记录,改为DESC即可
  • 筛选row_num = 1:每个分组仅保留第一条记录,实现同一用户同一手机号去重,不同用户同一手机号的记录全部保留

内容的提问来源于stack exchange,提问作者D_Q

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:21:49