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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:05:23