with temp as ( select tname,card_id,scores,open_id,inserttime, count(1) over(partition by open_id) as card_cnt, row_number() over(partition by open_id order by inserttime) as card_asc, row_number() over(partition by open_id order by scores desc,inserttime desc) as card_desc from text1 where open_id in ( select open_id from text1 group by open_id having count(distinct card_id)>1 ) ),temp_a as ( select * from temp where card_cnt > 1 and card_asc=1 ),temp_b as ( select * from temp where card_cnt > 1 and card_desc=1 ) select a.tname as 姓名,b.scores as 考核最高分 from temp_a a left join temp_b b on a.open_id = b.open_id; 解题思路
时间: 2024-04-17 17:27:44 浏览: 82
找出最高分
5星 · 资源好评率100%
这个SQL查询的目标是找出在表text1中有多张卡片的用户中,每个用户的第一张卡片和最后一张卡片的姓名和考核最高分。
首先,使用子查询temp找出所有有多张卡片的用户,并为每个用户的每张卡片计算出以下信息:
- tname: 姓名
- card_id: 卡片ID
- scores: 考核分数
- open_id: 用户ID
- inserttime: 插入时间
- card_cnt: 用户拥有的卡片数量
- card_asc: 卡片按插入时间升序排列的序号
- card_desc: 卡片按考核分数降序和插入时间降序排列的序号
接下来,使用子查询temp_a找出每个用户的第一张卡片,条件为card_cnt大于1且card_asc为1。
然后,使用子查询temp_b找出每个用户的最后一张卡片,条件为card_cnt大于1且card_desc为1。
最后,通过左连接将temp_a和temp_b连接起来,并选择姓名和考核最高分作为结果。
请注意,这只是一个解题思路,并没有完整的代码,实际使用时可能需要根据具体数据库类型和表结构进行调整。
阅读全文