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

技术请求:为多手机号筛选最近日期,同日期取最小号码

按客户筛选最近创建日期且手机号最小的记录

嘿,这个需求用SQL的窗口函数就能完美解决!我来给你一步步拆解怎么实现:

首先明确需求:为每个客户筛选出最近创建日期的记录;如果同一客户下多个手机号的创建日期相同且都是最近的,就选手机号数值最小的那条。

先准备测试数据

我把你提供的数据转换成可直接测试的SQL表(以MySQL为例,其他数据库语法类似):

CREATE TABLE customer_phones (
    CustomerID INT,
    PhoneNumber VARCHAR(20),
    CreatedDate DATE
);

INSERT INTO customer_phones VALUES
(1111, '1234587', '2013-09-10'),
(1111, '1243557', '2013-09-11'),
(1111, '3214562', '2009-12-01'),
(2222, '7654312', '2013-02-05'),
(2222, '6544343', '2006-07-23'),
(2222, '7652135', '2006-04-16'),
(2222, '5672851', '2010-11-16'),
(2222, '4726722', '1998-06-18');

核心解决方案

用ROW_NUMBER()窗口函数来给每条记录排名,逻辑如下:

  1. 按CustomerID分组,每个客户单独处理
  2. 先按CreatedDate倒序排序(最近的日期排第一)
  3. 如果日期相同,再按PhoneNumber升序排序(手机号小的排前面)
  4. 最后只取每组排名第一的记录

对应的SQL代码:

SELECT CustomerID, PhoneNumber, CreatedDate
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY CustomerID 
            ORDER BY CreatedDate DESC, PhoneNumber ASC
        ) AS rn
    FROM customer_phones
) AS ranked_records
WHERE rn = 1;

执行结果说明

运行上面的SQL后,得到的结果是:

CustomerIDPhoneNumberCreatedDate
111112435572013-09-11
222276543122013-02-05

这里提一句:你提供的期望输出里2222的记录是4726722 1998-06-18,这应该是把“最近”写成“最早”的笔误啦~如果需求是筛选最早创建日期的记录,只需要把ORDER BY CreatedDate DESC改成CreatedDate ASC就行,这样就能得到你给出的示例输出。

内容的提问来源于stack exchange,提问作者Naga Sushma Kallam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:03:52