请编写一条 SQL 语句,从访问记录表中查询出每个页面的最新访问日期(仅返回页面及其最近一次访问日期)。
考察说明
考察对 SQL 分组聚合与最大值统计的掌握,以及使用窗口函数或子查询的优化能力。
回答思路
- 【回答框架 1】定义需求:按页面分组,取每组中访问日期最大的记录。核心思路是对页面字段进行分组,对日期字段取最大值。分组可用 GROUP BY,最大值可用 MAX 函数。
- 【回答框架 2】给出最简方案:SELECT page, MAX(access_date) FROM access_log GROUP BY page;其中 page 为页面标识,access_date 为访问日期字段。该方法直接返回每个页面的最近访问日期,但若需要同时返回该日期对应的完整记录,则需要额外处理。
- 【回答框架 3】若需返回完整记录,可先查出每组最大日期,再与原表连接:SELECT * FROM access_log t JOIN (SELECT page, MAX(access_date) AS max_date FROM access_log GROUP BY page) sub ON t.page = sub.page AND t.access_date = sub.max_date;此方法可获取该日期下的所有访问记录。
- 【回答框架 4】也可使用窗口函数 ROW_NUMBER() 按页面分区按日期降序编号,取编号为 1 的记录;该方法更直观且可扩展,但需注意数据库版本对窗口函数的支持。
- 【关键点 1】GROUP BY 与 MAX 组合可准确得到每个页面的最近访问日期。
- 【关键点 2】若需完整记录,使用子查询或窗口函数避免丢失其他列。
- 【关键点 3】日期字段需确保为日期或时间戳类型,否则排序和比较可能出错。
- 【易错点 1】忽略日期字段可能包含时间部分,导致同日多次访问被重复统计,需明确需求。
- 【易错点 2】直接 SELECT * 与 GROUP BY 混用可能在某些数据库下报错或返回不确定记录,应避免。
- 【易错点 3】窗口函数在大数据集上性能可能较低,需根据数据量和索引优化。