我有一张表格:
userid rank name
-------------------
1 4 raj
1 90 frank
1 100 neeta
1 123 liz
2 2 liz
2 20 neeta
2 23 frank
2 222 raj
Run Code Online (Sandbox Code Playgroud)
我需要把它转换成
userid min_rank next_min_rank
-------------------------------
1 raj frank
2 liz neeta
Run Code Online (Sandbox Code Playgroud)
我一直在网上搜索这个问题很长一段时间但找不到解决方案.
能否请你帮忙?
此查询将为每个用户选择最小排名和下一个排名:
select s.userid, s.min_rank, min(users.rank) as next_rank
from (
select userid, min(rank) as min_rank
from users
group by userid) s left join users
on users.userid = s.userid and s.min_rank<users.rank
group by s.userid
Run Code Online (Sandbox Code Playgroud)
这将显示名称:
select t.userid, t1.name, t2.name
from (
select s.userid, s.min_rank, min(users.rank) as next_rank
from (
select userid, min(rank) as min_rank
from users
group by userid) s left join users
on users.userid = s.userid and s.min_rank<users.rank
group by s.userid ) t
left join users t1 on t.userid=t1.userid and t.min_rank=t1.rank
left join users t2 on t.userid=t2.userid and t.next_rank=t2.rank
Run Code Online (Sandbox Code Playgroud)
结果是:
1 raj frank
2 liz neeta
Run Code Online (Sandbox Code Playgroud)
如果可能有多个具有相同等级的用户,这取决于您想要如何处理这种情况,您可以添加以下内容:
group by t.userid
Run Code Online (Sandbox Code Playgroud)
仅显示其中之一。GROUP_CONCAT(t1.name), GROUP_CONACT(t2.name)也许你也可以在选择上使用。