Window 函数与分组依据
Window Functions vs Group by
我对 SQL 和数据工程还很陌生。最近偶然接触到window函数,发现window函数执行的操作也可以用group by来完成。这里有人可以解释一下两者之间的区别以及什么时候可以使用 window 函数而不是分组依据。
致模组 - 请不要关闭此问题。这个问题以前没有发布过,我相信一个好的答案会给堆栈社区带来很多价值。我在互联网上搜索答案,但没有 website/article/video 有明确的解释,他们只会让我更加困惑。
简而言之,非常简单:window函数保留结果行,group by
压缩它们。如果您需要的信息与聚合相关,则需要 group by
,如果信息与特定行相关,则需要 window 函数。
例如:假设您有员工的部门和薪水集合。要知道部门的平均工资是多少,您可以使用 select dept_id, avg(salary) from emp group by dept
(聚合)。要了解每个员工与平均值的差异,请使用 select emp_id, salary - avg(salary) over (partition by dept_id) from emp
(window 函数)。
还有几个用例可以用window函数和group by
都解决,比如select grp, min(value) ... group by grp
等价于select grp, value from (select grp, row_number() over (partition by grp order by value) as rn, value ...) x where x.rn = 1
)所以边框是有些模糊,其他标准(例如可读性、可扩展性或性能)必须帮助做出决定。
我对 SQL 和数据工程还很陌生。最近偶然接触到window函数,发现window函数执行的操作也可以用group by来完成。这里有人可以解释一下两者之间的区别以及什么时候可以使用 window 函数而不是分组依据。
致模组 - 请不要关闭此问题。这个问题以前没有发布过,我相信一个好的答案会给堆栈社区带来很多价值。我在互联网上搜索答案,但没有 website/article/video 有明确的解释,他们只会让我更加困惑。
简而言之,非常简单:window函数保留结果行,group by
压缩它们。如果您需要的信息与聚合相关,则需要 group by
,如果信息与特定行相关,则需要 window 函数。
例如:假设您有员工的部门和薪水集合。要知道部门的平均工资是多少,您可以使用 select dept_id, avg(salary) from emp group by dept
(聚合)。要了解每个员工与平均值的差异,请使用 select emp_id, salary - avg(salary) over (partition by dept_id) from emp
(window 函数)。
还有几个用例可以用window函数和group by
都解决,比如select grp, min(value) ... group by grp
等价于select grp, value from (select grp, row_number() over (partition by grp order by value) as rn, value ...) x where x.rn = 1
)所以边框是有些模糊,其他标准(例如可读性、可扩展性或性能)必须帮助做出决定。