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
子句的原因:
- 限制结果集:如果您不使用 WHERE to_date = "9999-01-01" 条件,查询将返回 salaries 表中所有记录的 emp_no、salary 和 running_total,而不考虑它们是否仍然是有效的薪资记录。这可能导致您得到过时或不再相关的数据。
- 获取当前薪资:在许多薪资管理系统中,员工的薪资可能会随时间变化,并且每条记录都会有一个生效日期(from_date)和终止日期(to_date)。终止日期为 "9999-01-01" 通常表示这是员工的当前薪资记录,没有明确的终止日期。
- 数据一致性:如果您的查询是为了生成报告或分析,您通常只对当前有效的薪资数据感兴趣。不包括 WHERE 子句可能会导致结果集中包含已经过期或不再适用的薪资记录,从而影响数据的一致性和准确性。
如果不加 WHERE to_date = "9999-01-01"
子句,查询将返回所有记录,包括那些可能已经结束或被新的薪资记录替换的记录。这可能会导致:
- 数据冗余:您可能会得到重复的
emp_no
,因为一个员工可能有多个薪资记录,每个记录在不同的时间段内有效。 - 不准确的分析:如果您使用这些数据进行分析或报告,可能会包含过时的薪资信息,导致分析结果不准确。
- 性能影响:返回更多的记录可能会增加查询的执行时间和资源消耗,尤其是在
salaries
表很大的情况下。
因此,使用 WHERE to_date = "9999-01-01"
子句是为了确保查询结果只包含当前有效的薪资记录,从而提供更准确和一致的数据。