为啥我无法计算我订购的列的运行总和?

Posted

技术标签:

【中文标题】为啥我无法计算我订购的列的运行总和?【英文标题】:How come I cannot calculate the running sum on the column I am ordering by?为什么我无法计算我订购的列的运行总和? 【发布时间】:2021-12-28 06:28:10 【问题描述】:

例如,我有这个Candidates 表:

    Candidates table:
+-------------+------------+--------+
| employee_id | experience | salary |
+-------------+------------+--------+
| 1           | Junior     | 10000  |
| 9           | Junior     | 10000  |
| 2           | Senior     | 20000  |
| 11          | Senior     | 20000  |
| 13          | Senior     | 50000  |
| 4           | Junior     | 40000  |
+-------------+------------+--------+

我只想计算Seniors 的薪水总和。这可能是我的脑残,但为什么这个查询不能像我期望的那样工作:

select *
      , count(employee_id) over (order by salary)
      , sum(salary) over (order by salary)
from Candidates
where experience = 'Senior'

select *
      , count(employee_id) over (order by salary, employee_id)
      , sum(salary) over (order by salary, employee_id)
from Candidates
where experience = 'Senior'

为什么我需要在 order by 子句中包含额外的 employee_id

【问题讨论】:

【参考方案1】:

使用ORDER BY salary 在窗口中对薪水求和在两个或更多记录与相同薪水相关的情况下的行为方式不会像您期望的那样。在这种情况下,如您所见,重复记录都将具有相同的滚动总和值。实际上,这是您似乎真正想要的查询:

SELECT *,
    COUNT(employee_id) OVER (ORDER BY employee_id) AS cnt,
    SUM(salary) OVER (ORDER BY employee_id) AS total_salary
FROM Candidates
WHERE experience = 'Senior';

以上以employee_id为取总和的顺序取工资的滚动总和。

【讨论】:

但是如果我还需要按升序排序的薪水呢?仅按 employee_id 排序是行不通的。问题其实来自leetcode.com/problems/… 如果您想按薪水对结果集进行排序,那么您可能需要一个ORDER BY 子句。

以上是关于为啥我无法计算我订购的列的运行总和?的主要内容,如果未能解决你的问题,请参考以下文章

连接表SQL PHP中列的总和不起作用[重复]

自动计算数据表页脚中具有数字数据的列的总和

Datagrid:计算页脚中列的平均值或总和

基于其他列的列的SQL总和[关闭]

如何通过函数的结果(总和)订购选择?

excel如何自动统计一周的列计数总和?