技术请求:为多手机号筛选最近日期,同日期取最小号码
按客户筛选最近创建日期且手机号最小的记录
嘿,这个需求用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()窗口函数来给每条记录排名,逻辑如下:
- 按
CustomerID分组,每个客户单独处理 - 先按
CreatedDate倒序排序(最近的日期排第一) - 如果日期相同,再按
PhoneNumber升序排序(手机号小的排前面) - 最后只取每组排名第一的记录
对应的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后,得到的结果是:
| CustomerID | PhoneNumber | CreatedDate |
|---|---|---|
| 1111 | 1243557 | 2013-09-11 |
| 2222 | 7654312 | 2013-02-05 |
这里提一句:你提供的期望输出里2222的记录是4726722 1998-06-18,这应该是把“最近”写成“最早”的笔误啦~如果需求是筛选最早创建日期的记录,只需要把ORDER BY CreatedDate DESC改成CreatedDate ASC就行,这样就能得到你给出的示例输出。
内容的提问来源于stack exchange,提问作者Naga Sushma Kallam
相关产品推荐
相关产品推荐

