SQL面试题更新 2026-08-05

在SQL查询中,累计求和通常采用哪种窗口函数来实现?请解释PARTITION BY子句在此类操作中的具体功能是什么?

技术原理SQL

考察说明

考查对SQL窗口函数,特别是累计求和及PARTITION BY子句的理解与应用能力。

回答思路

  1. 【回答框架 1】累计求和可通过窗口函数SUM()配合OVER()子句实现,语法为SUM(列) OVER (ORDER BY 排序列)。该函数会按指定顺序对当前行及之前所有行的值进行累加,生成运行总计,与普通聚合函数不同,窗口函数不会合并行,每行都保留独立结果。
  2. 【回答框架 2】PARTITION BY子句用于将结果集分割成多个逻辑分区,窗口函数在每个分区内独立计算。例如,SUM(金额) OVER (PARTITION BY 部门 ORDER BY 日期)会在每个部门内按日期累计金额,实现分组累计求和,不影响最终输出行数。
  3. 【回答框架 3】对比GROUP BY,PARTITION BY不会减少行数,而是在分区基础上保留所有原始行,并附加聚合结果。若省略PARTITION BY,则整个结果集视为单一分区,计算全局累计。
  4. 【回答框架 4】实际使用时需注意ORDER BY的确定性与稳定性,若排序列存在重复值,累计结果可能因数据库实现差异产生不确定性,建议添加唯一排序列以确保预测结果。
  5. 【回答框架 5】窗口函数支持多个分区键和复杂排序,可灵活用于移动平均、占比计算等场景,但需注意性能开销,大数据集下可能影响查询效率。
  6. 【关键点 1】累计求和使用SUM() OVER (ORDER BY ...)实现运行总计。
  7. 【关键点 2】PARTITION BY将数据分区,使窗口函数在分区内独立计算。
  8. 【关键点 3】PARTITION BY不减行数,与GROUP BY有本质区别。
  9. 【关键点 4】确定性排序对结果可预测性至关重要。
  10. 【关键点 5】窗口函数性能需在大数据集下谨慎评估。
  11. 【易错点 1】将PARTITION BY与GROUP BY混淆,导致行数减少及结果错误。
  12. 【易错点 2】忽略ORDER BY导致累计顺序不确定,结果不一致。
  13. 【易错点 3】未考虑大数据量下窗口函数性能开销,造成查询缓慢。