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