You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL学习疑问:保留单行同时实现分组计算应使用哪种功能?

保留原始行数据同时按组计算的SQL方案

各选项的实际作用

  • Group By + 聚合函数(Aggregate):用这个会把同组的行合并成一行,只输出每组的聚合结果,原始行数据会丢失,完全不符合你要保留各行的需求。比如执行SELECT department, AVG(salary) FROM employees GROUP BY department,只能拿到每个部门的平均工资,看不到单个员工的信息。
  • CTE(公共表表达式):CTE只是用来定义临时查询结果的语法,本身没法直接实现“保留行+按组计算”,它可以配合窗口函数等方法使用,但单独用解决不了你的问题。
  • 窗口函数(Window Functions):这正是你需要的工具。窗口函数能在不合并原始行的前提下,对指定分组(窗口)内的数据做聚合计算,计算结果会和每一行的原始数据一起返回。

实际示例

假设你有一张员工表employees,字段包括id、name、department、salary,要保留每个员工的全部信息,同时算出其所在部门的平均工资,用窗口函数的写法如下:

SELECT 
    id,
    name,
    department,
    salary,
    -- 按部门分组计算平均工资,结果对应到每一行
    AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary
FROM employees;

这里PARTITION BY department指定了按部门分组,AVG(salary) OVER (...)会为每一行生成其所在部门的平均工资,所有原始员工数据都会被保留。

结论

如果你的需求是保留所有原始行数据同时完成按组计算,直接使用窗口函数是最直接的解决方案。Group By会合并行,满足不了需求;CTE只是辅助写法,无法单独实现目标。

内容的提问来源于stack exchange,提问作者not ye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:31:05