# 解题思路: # ①本题关键在于把sum聚合函数作为窗口函数使用,所有聚合函数都能用做窗口函数,其语法和专用窗口函数完全相同。 # sum(<汇总列>) over(<排序列>) as 别名; # ②光看题目“前两个员工的salary累计和”不是很好理解,结合输出格式可以理解为running_total列是逐个员工的工资的累计和,每一行的工资都是前面所有行的工资总计。 # ③这有一个小bug,题目没有限定时间为当前,而按照输出格式来看和通过情况来看,只有限定时间为当前'9999-01-01'才能符合输出格式,才能通过,一开始考虑用员工分组,但是员工分组得到的结果并非题目本意,必须限定时间为当前。 select s.emp_no,s.salary,SUM(salary) OVER (ORDER BY emp_no) as running_total from salaries s where s.to_date='9999-01-01' group by s.emp_no # 题干表述应该是有问题,running_total给出的应该是前面所有员工的salary之和 # select a.emp_no, a.salary, sum(b.salary) # from salaries as a, salaries as b # where b.emp_no <= a.emp_no # and a.to_date = '9999-01-01' # and b.to_date = '9999-01-01' # group by a.emp_no # order by a.emp_no asc