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-27 20:15
还能挽救吗?找同学帮忙看了一下&nbsp;字节怎么能如此对我
牛客26396789...:你这是严重红线,被发现你自己永远进不去,你那个同学直接走人,你还敢宣扬
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 12:11
我最近都有点不想活了,天天早10晚11的,还问我爱不爱她目前的状态别说爱谁了,没扇谁就不错了。是不是大家都是一进节子,只有工作没有爱情了
AzureSkies:在字节的时候找的就是字节的,飞书太适合恋爱人士了,能看到是不是已读,是不是在会议中。简直冥婚好伴侣
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
05-20 13:59
门头沟学院 Java
米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
字节一直是我的白月光,考虑到转正还是拒了日常实习。
从明天开始狠狠卷JV...:为什么你释放的offer没流到我头上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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