non-equi join更好理解的方法

统计salary的累计和running_total

http://www.nowcoder.com/questionTerminal/58824cd644ea47d7b2b670c506a159a6

window function大家可能都能明白,也很好用。我看到大神有种用non-equi join的方法也可以得解,而且很普遍。

SELECT s1.emp_no, s1.salary,
    (SELECT SUM(s2.salary)
    FROM salaries s2
    WHERE s2.emp_no <= s1.emp_no
    AND s2.to_date = '9999-01-01') 
FROM salaries s1
WHERE s1.to_date = '9999-01-01'
ORDER BY s1.emp_no;

其实我是不太理解这种方法的,是如何直接在select里面就取出来值,欢迎大佬来解释一下,我也用non-equi的方法写出了一个解,更加好理解一点,发出来和大家交流一下。

SELECT s1.emp_no, s1.salary, SUM(s2.salary)  AS running_total
FROM salaries s1, salaries s2
WHERE s1.emp_no >= s2.emp_no
AND s1.to_date = '9999-01-01'
AND s2.to_date = '9999-01-01'
GROUP BY s1.emp_no
ORDER BY s1.emp_no;
全部评论
SELECT a.emp_no, a.salary, SUM(b.salary) FROM salaries AS a INNER JOIN salaries AS b ON a.emp_no >= b.emp_no WHERE a.to_date = '9999-01-01' AND b.to_date = '9999-01-01' GROUP BY a.emp_no, a.salary; 上面是我的代码,原理差不多。便于理解的话,可以先运行一下下面的代码。 SELECT a.emp_no, a.salary, b.emp_no, b.salary FROM salaries AS a INNER JOIN salaries AS b ON a.emp_no >= b.emp_no WHERE a.to_date = '9999-01-01' AND b.to_date = '9999-01-01'; 输出的结果是将每一个emp_no都与比自己小的emp_no重新组成了一条新纪录。 对于这个结果,只要将a的emp_no和salary进行group by,将b的salary求和就能得到答案了~
点赞 回复 分享
发布于 2021-05-06 16:00

相关推荐

爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务