SQL面试题更新 2026-08-05

请编写一条 SQL 查询语句,用于获取每位客户对应的姓名,以及该客户第一笔订单的订单总金额。注意:需要为每个客户返回其最早订单的相关金额信息。

编码实现问题拆解SQL

考察说明

考查 SQL 窗口函数或关联子查询的运用,以及处理每组第一条记录的能力。

回答思路

  1. 【回答框架 1】可以选用窗口函数 ROW_NUMBER() 按客户分区,按订单日期排序(若有订单 ID 则按其递增),为每个客户生成序号,然后筛选序号为 1 的记录,再关联客户表或直接查询所需字段。
  2. 【回答框架 2】另一种思路是使用关联子查询:先找出每个客户最早订单的日期(或订单 ID),再通过该日期(或 ID)自关联订单表,得到对应订单金额,最后关联客户表获取姓名。
  3. 【回答框架 3】若订单表有 order_id 自增主键,可用 MIN(order_id) 表示最早订单,因为通常 order_id 递增可反映时间先后;若仅有订单日期且可能重复,则需考虑使用更稳妥的排序键。
  4. 【回答框架 4】最终查询结果应包含 customer_id(可选)、姓名(customer_name)和第一个订单的总金额(amount),并注意金额字段的命名与类型。
  5. 【关键点 1】窗口函数 ROW_NUMBER() 按客户分区并按订单日期排序,取 rn=1 的行。
  6. 【关键点 2】关联子查询需筛选出每个客户最早订单的日期或 ID,再与原表关联。
  7. 【关键点 3】处理日期相同的情况:需要明确排序规则,必要时增加订单 ID 作为次排序键。
  8. 【易错点 1】若直接使用 GROUP BY 客户然后取金额,会得到总和而非第一个订单金额。
  9. 【易错点 2】在关联子查询中若用日期作为关联条件,当同一客户有多笔订单在同一日期时,可能返回多行,需要额外去重或指定唯一键。
  10. 【易错点 3】未考虑订单状态可能导致金额包含无效订单,应依据实际业务过滤(如 status 字段),但题目若未提及则不必额外添加条件。