SQL面试题更新 2026-08-05

请写出一条SQL语句,用于检索每位客户的姓名以及他们最近一次(即上一个)订单的总额。

编码实现技术原理SQL

考察说明

考查SQL窗口函数或子查询实现分组取最新记录的能力,以及金额聚合的准确性。

回答思路

  1. 【回答框架 1】使用窗口函数ROW_NUMBER()按客户ID分区,按订单日期或订单ID排序,为每个订单生成行号,筛选行号为1的记录,即可得到每个客户的上一个订单。
  2. 【回答框架 2】若订单日期可能重复,采用订单ID或时间戳作为排序条件,确保排序唯一;若需要严格‘上一个’概念,需定义排序规则,如订单创建时间降序、订单ID降序。
  3. 【回答框架 3】对于总金额,若订单明细表存在,需先按订单聚合金额,或使用子查询计算每笔订单金额,再关联客户表获取姓名。
  4. 【回答框架 4】另一种方案是使用横向连接(LATERAL)或相关子查询找到每个客户的最大订单日期,再连接订单表获取金额,但需注意性能与数据量。
  5. 【关键点 1】窗口函数ROW_NUMBER()配合PARTITION BY customer_id ORDER BY order_date DESC可定位每客户最近订单。
  6. 【关键点 2】若订单无唯一时间,需结合订单ID等唯一字段确保严谨排序。
  7. 【关键点 3】金额必须基于订单明细表求和,而非订单主表直接字段,除非主表已存总额。
  8. 【易错点 1】直接使用GROUP BY客户后取MAX(金额)可能误取到非最近订单的金额。
  9. 【易错点 2】若订单日期为NULL或存在异常值,可能导致排序错误,需预先处理。
  10. 【易错点 3】关联查询时未过滤行号条件,会返回客户所有订单而不是仅一个。