请写出一条 SQL 语句,用于检索在订单表中存在至少一条订单记录的客户,并返回每位这样的客户的姓名以及其最近一次下单的日期。
考察说明
考查 SQL 中聚合函数与分组查询的应用,以及通过连接查询关联客户和订单表的能力。
回答思路
- 【回答框架 1】核心思路是使用 MAX() 函数获取每个客户的最新订单日期,同时需要确保客户姓名正确关联。由于客户姓名可能在客户表中,而订单信息在订单表中,因此需要通过连接(JOIN)将两表关联,并按客户分组。
- 【回答框架 2】具体步骤:先按客户ID分组,计算出每个客户的最大订单日期(MAX(order_date));然后通过 JOIN 客户表,使得最终结果包含客户姓名。注意:如果客户表中有多个同姓名的客户,需要保证按客户ID分组,避免错误合并。
- 【回答框架 3】另一种写法是使用窗口函数,如 ROW_NUMBER() 或 RANK() 按客户分区并按订单日期降序排序,取排名为1的记录,这样能直接得到客户姓名和最新订单日期,也更易读。
- 【回答框架 4】还要考虑订单表中可能有多条记录在同一日期,此时结果应保留该客户的所有当日订单还是仅一条?通常需求是“最新订单日期”,所以每条客户只显示一行即可。若严格要求返回所有最新订单,则需要额外的条件处理。
- 【回答框架 5】最终 SQL 应包含 WHERE 子句过滤订单表中没有记录的客户(通过 INNER JOIN 或 EXISTS 进行过滤),确保只返回有订单的客户。
- 【关键点 1】使用 GROUP BY 和 MAX() 获取每组的最新日期
- 【关键点 2】使用 INNER JOIN 连接订单表与客户表,过滤无订单客户
- 【关键点 3】按客户ID分组,避免同名客户错误聚合
- 【易错点 1】GROUP BY 中必须包含所有非聚合查询列,如客户姓名,否则可能报错或产生不确定结果
- 【易错点 2】当订单日期相同时,需明确是否保留重复记录,否则可能返回多行导致结果不符
- 【易错点 3】若直接对客户姓名分组而忽略 ID,可能合并不同客户的重名数据,造成统计错误