工作遇到的sql问题:left join 最新一条数据

工作遇到的sql问题:left join 最新一条数据

1:需求介绍

表achievement_records 是记录学生是否有作业(同一个学生、同一个作业只有一条记录----是否交了作业,最高成绩)
表achievement 是记录学生每次作业的上交记录(同一个学生,同一个作业可以上交N次-----每次作业都有分数、评语)
期望:achievement_records  left join achievement (同一个学生、同一个作业,最后一次作业的分数)
ps:several_times 当前是第几次提交作业

2:看下数据格式

在这里插入图片描述

期望:left join这张表数据时,红框内的2条数据,只想关联到several_times最大的一条数据。

3:分析

如何取到指定user_id、homework_id 的 several_times最大的一条数据?
思路1:先对several_times 进行倒叙排序,然后使用分组:
sql 如下:

SELECT	*FROM	(
	SELECT * FROM achievement ORDER BY several_times DESC
) a GROUP BY a.user_id, a.homework_id

思路2:先对user_id、homework_id进行分区,在对several_times 进行降序排序

with cte as (
  SELECT *,row_number() OVER(PARTITION BY  user_id,homework_id order by several_times desc) rn from achievement where del_flag = 0
) select * from cte where rn=1

结果思路1是错误的。执行结果获取到several_times = 1的数据
在这里插入图片描述

思路2满足预期结果
在这里插入图片描述

4:联表查询语句

SELECT ar.user_id,ar.homework_id,ar.high_score,a.score,a.several_times 
FROM achievement_records ar
LEFT JOIN (
	WITH cte AS (
		SELECT *,row_number() OVER(PARTITION BY  user_id,homework_id ORDER BY several_times DESC) rn FROM achievement WHERE del_flag = 0
	) SELECT * FROM cte WHERE rn=1
) a ON a.user_id = ar.user_id AND a.homework_id = ar.homework_id AND a.del_flag = 0
WHERE ar.del_flag = 0 
AND ar.user_id = 1381864516219863041
AND ar.homework_id = 1386602729492758530

ps:此文章仅记录工作遇到的问题,并不包含项目或公司敏感信息。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值