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