窗口函数与分组依据

fre*_*021 3 sql group-by window-functions

我对 SQL 和数据工程相当陌生。最近偶然接触到窗口函数,发现窗口函数执行的操作也可以用group by来完成。

\n

有人可以解释一下两者之间的区别以及何时在 group by\xe2\x80\xaf 上使用窗口函数吗?

\n

Tom*_*ský 6

简而言之,非常简单:窗口函数保留结果行,group by压缩它们。如果您需要的信息与您需要的聚合相关group by,如果信息与您需要的特定行相关,则需要窗口函数。

例如:假设您有包含部门和薪水的员工集合。要了解部门的平均工资是多少,可以使用select dept_id, avg(salary) from emp group by dept(聚合)。要了解每个员工与平均值的差异,请使用select emp_id, salary - avg(salary) over (partition by dept_id) from emp(窗口函数)。

还有一些用例可以通过窗口函数 和 来解决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),因此边界有些模糊,其他标准(例如可读性、可扩展性或性能)必须帮助决定。

  • 另一个区别是窗口函数中的窗口可以重叠,从而允许计算运行总计、上一行、下一行等。Group by 严格将行分隔到互斥的存储桶中。 (3认同)