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

相关推荐

不愿透露姓名的神秘牛友
06-11 13:34
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务