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
相关产品推荐
相关产品推荐

