SQL面试题更新 2026-08-05

请编写一条SQL语句,为每个用户的访问记录添加一个序号列,该序号需按照访问日期的顺序进行排列。

编码实现技术原理SQL

考察说明

考查窗口函数(ROW_NUMBER)在分组排序场景下的应用。

回答思路

  1. 【回答框架 1】使用窗口函数ROW_NUMBER() OVER (PARTITION BY 用户ID ORDER BY 访问日期) 为每个用户独立生成从1开始的递增序号。
  2. 【回答框架 2】具体语句为:SELECT 用户ID, 访问日期, ROW_NUMBER() OVER (PARTITION BY 用户ID ORDER BY 访问日期) AS 序号 FROM 访问记录表; 若日期相同,需按其他字段(如访问时间)进行二级排序以保证序号稳定。
  3. 【回答框架 3】窗口函数在数据库如MySQL 8.0、PostgreSQL、SQL Server、Oracle中均支持,可直接使用;若版本不支持,可通过子查询关联实现,但性能较差。
  4. 【回答框架 4】注意ORDER BY子句在窗口函数中仅影响序号分配,不改变查询结果的最终排序;若需要结果按用户和序号显示,可在最外层添加ORDER BY。
  5. 【关键点 1】ROW_NUMBER() OVER (PARTITION BY 用户ID ORDER BY 访问日期) 实现分组编号。
  6. 【关键点 2】窗口函数不改变结果集行数,仅新增计算列。
  7. 【关键点 3】日期相同需依赖唯一排序键(如时间戳)避免序号随机。
  8. 【易错点 1】不要使用GROUP BY,会聚合行而非编号。
  9. 【易错点 2】窗口函数中ORDER BY的字段若存在重复,会导致序号不稳定,应补充唯一键。
  10. 【易错点 3】老版本数据库不支持窗口函数,需改用变量或连接,但复杂且易错。