Oracle中如何获取每个手机号对应的最新订单?
Oracle 获取每个手机号对应的最新订单解决方案
你的原SQL仅能处理单个手机号的场景,当查询多个手机号时,rownum<=1只会返回整个结果集的第一条记录,无法实现按每个手机号分组取最新订单的需求。以下是几种可行的解决方案:
方法一:使用ROW_NUMBER()窗口函数(推荐)
这是最通用且清晰的方式,支持所有Oracle版本,还能灵活处理同一手机号多条最新订单的情况:
SELECT * FROM ( SELECT orders.*, ROW_NUMBER() OVER (PARTITION BY phonenum ORDER BY order_date DESC) AS rn FROM orders -- 可选:筛选特定手机号,比如 WHERE phonenum IN ('914780', '123456') ) t WHERE t.rn = 1;
PARTITION BY phonenum:按手机号分组ORDER BY order_date DESC:每组内按订单日期倒序排列,最新的排在最前ROW_NUMBER():给每组内的记录编号,rn=1就是每组的第一条(最新订单)
方法二:使用FETCH FIRST WITH TIES(Oracle 12c+)
如果你的Oracle版本是12c及以上,可以用更简洁的语法:
SELECT * FROM orders ORDER BY ROW_NUMBER() OVER (PARTITION BY phonenum ORDER BY order_date DESC) FETCH FIRST 1 ROW WITH TIES;
这个语法会自动返回所有分组中排名第一的记录,也就是每个手机号的最新订单。
方法三:关联子查询(兼容低版本Oracle)
如果使用的是Oracle 11g及以下版本,可以用关联子查询实现:
SELECT o.* FROM orders o WHERE o.order_date = ( SELECT MAX(order_date) FROM orders WHERE phonenum = o.phonenum );
注意:如果同一手机号在同一时间有多条订单,这个方法会返回所有符合日期的记录,若只需一条,可在子查询中增加额外的排序字段(比如订单ID)来唯一确定最新订单。
内容的提问来源于stack exchange,提问作者mostafa elmadany
相关产品推荐
相关产品推荐

