如何解决按列排序有重复项以进行汇总
select name,gender,salary,sum(salary) over(order by salary)
from Employees
问题: 为什么按具有重复项的列进行排序会产生最终值而不是中间值? 例如执行此查询时,有3名员工的薪水= 5000,那么最终值,即应为第3位员工产生的值是为第1位员工产生的?
解决方法
这就是聚合窗口功能的工作方式。有关系时,它们都将获得相同的价值。 count()
,min()
,max()
等也是如此。
如果您想在每行上使用不同的值,请在order by
子句中添加另一列(或一组列)以使其具有确定性(即打破联系)。假设employee_id
是表中的主键,然后:
select name,gender,salary,sum(salary) over(order by salary,employee_id)
from Employees
order by salary,employee_id
,
SQL窗口函数具有一个窗口框架子句,该子句指定了窗口函数中包含哪些行。默认情况下,默认使用range between unbounded preceding and current row
,因此您的代码实际上是:
sum(salary) over (order by salary range between unbounded preceding and current row)
range
分区对领带的平等对待,因此所有元素都包含在框架中-或不包含任何内容。
替代方法是row
分区,该分区分别处理每一行:
sum(salary) over (order by salary row between unbounded preceding and current row)
SQL标准指定range
为默认值(我猜测结果是稳定的,请参见下文)。因此,这是所有数据库中的默认设置。
当薪水不同时,这些将返回相同的值。但是,它们并不总是与this fiddle所示相同。
请注意,如果有关系,并且窗框使用rows
,则结果为不稳定。这意味着在不同的运行中,您可以在给定的行上获得不同的结果(我可以从个人经验中得出,这非常非常难以调试)。
您可以通过在order by
中包含唯一密钥来解决此问题,这是GMB建议的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。