SQL面试题更新 2026-08-05

请写出一条SQL语句,利用开窗函数对每个页面的访问次数进行累计求和,以得到每个页面在不同时间点的累计访问次数。

编码实现技术原理SQL

考察说明

考察对SQL开窗函数(窗口函数)的掌握,特别是SUM() OVER()用于累计求和的计算。

回答思路

  1. 【回答框架 1】开窗函数在SQL中用于在保持行数不变的情况下,对指定窗口内的行进行聚合计算。与GROUP BY不同,窗口函数不会减少行数,而是为每一行返回一个聚合值。
  2. 【回答框架 2】对于‘每个页面的累计访问次数’,需要按页面分区,并按时间或其他顺序排序,然后使用SUM(访问次数) OVER (PARTITION BY 页面 ORDER BY 时间) 作为累计值。
  3. 【回答框架 3】示例SQL:SELECT 页面, 访问时间, 访问次数, SUM(访问次数) OVER (PARTITION BY 页面 ORDER BY 访问时间 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 累计访问次数 FROM 访问表;
  4. 【回答框架 4】如果没有明确的排序字段,但需要按访问顺序累计,则必须明确指定ORDER BY子句,否则窗口函数将按无顺序的窗口计算,结果可能不符合预期。
  5. 【回答框架 5】开窗函数在SQL标准(如SQL:2003)中定义,主流数据库(如MySQL 8.0+、PostgreSQL、SQL Server、Oracle)均支持,但不同数据库的语法细节可能略有差异。
  6. 【关键点 1】窗口函数SUM() OVER()可以实现累计求和,且不减少行数。
  7. 【关键点 2】使用PARTITION BY按页面分组,ORDER BY定义累计顺序。
  8. 【关键点 3】累计范围通常为从分区首行到当前行,用ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW明确指定。
  9. 【关键点 4】没有合适排序字段时,累计顺序无意义,结果可能不稳定。
  10. 【关键点 5】窗口函数在MySQL 8.0及以上版本才支持,较低版本需改用变量或自连接。
  11. 【易错点 1】忘记指定ORDER BY导致窗口无顺序,累计结果可能不正确。
  12. 【易错点 2】错误使用GROUP BY会减少行数,无法保留每行明细。
  13. 【易错点 3】在MySQL 5.7及以下版本中直接使用窗口函数会抛出语法错误。