select
      emp_no,
      salary,
      sum(salary) over(order by emp_no) as running_total
from salaries
where to_date = "9999-01-01";

sum(salary) over(order by emp_no) as running_total

这是查询中的关键部分,使用了 SUM() 窗口函数来计算 running_total这里的 SUM() 函数不同于普通的聚合函数,因为它不会将所有行合并成一个结果,而是为结果集中的每一行计算一个值OVER 子句定义了窗口的排序和范围。

  • sum(salary): 这部分是窗口函数的主体,它计算当前行及其之前行的 salary 列的总和。
  • over(: 这个关键字后面跟着的是定义窗口的参数。
  • order by emp_no: 这部分指定了窗口内的排序方式。在这里,窗口是按照 emp_no 排序的。这意味着 SUM() 函数将按照 emp_no 的顺序计算薪资的累计和。
  • as running_total: 这部分给窗口函数的结果指定了一个别名,即 running_total,这样在查询结果中就可以用这个名字来引用这个计算出的累计薪资。

WHERE to_date = "9999-01-01" 这个条件用于选择那些在 to_date 列中具有特定值 "9999-01-01" 的记录。这个日期通常被用作一个占位符,表示记录是“当前的”或“有效的”,直到被显式地更新或删除

以下是为什么可能需要这个 WHERE 子句的原因:

  1. 限制结果集:如果您不使用 WHERE to_date = "9999-01-01" 条件,查询将返回 salaries 表中所有记录的 emp_no、salary 和 running_total,而不考虑它们是否仍然是有效的薪资记录。这可能导致您得到过时或不再相关的数据。
  2. 获取当前薪资:在许多薪资管理系统中,员工的薪资可能会随时间变化,并且每条记录都会有一个生效日期(from_date)和终止日期(to_date)。终止日期为 "9999-01-01" 通常表示这是员工的当前薪资记录,没有明确的终止日期。
  3. 数据一致性:如果您的查询是为了生成报告或分析,您通常只对当前有效的薪资数据感兴趣。不包括 WHERE 子句可能会导致结果集中包含已经过期或不再适用的薪资记录,从而影响数据的一致性和准确性。

如果不加 WHERE to_date = "9999-01-01" 子句,查询将返回所有记录,包括那些可能已经结束或被新的薪资记录替换的记录。这可能会导致:

  • 数据冗余:您可能会得到重复的 emp_no,因为一个员工可能有多个薪资记录,每个记录在不同的时间段内有效。
  • 不准确的分析:如果您使用这些数据进行分析或报告,可能会包含过时的薪资信息,导致分析结果不准确。
  • 性能影响:返回更多的记录可能会增加查询的执行时间和资源消耗,尤其是在 salaries 表很大的情况下。

因此,使用 WHERE to_date = "9999-01-01" 子句是为了确保查询结果只包含当前有效的薪资记录,从而提供更准确和一致的数据。