7

次の形式のテーブルがあります。

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

これをに変換する必要があります

userid  min_rank  next_min_rank
-------------------------------
1       raj       frank
2       liz       neeta

私は長い間この問題をネットで検索してきましたが、解決策を見つけることができませんでした。

手伝ってもらえますか?

4

4 に答える 4

2

このクエリは、最小ランクと、すべてのユーザーの次のランクを選択します。

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

antこれは名前を表示します:

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

結果は次のとおりです。

1  raj  frank
2  liz  neeta

同じランクのユーザーが複数いる可能性がある場合は、状況をどのように処理するかによって異なります。次のように追加するだけです。

group by t.userid

それらの1つだけを表示します。たぶん、あなたはまたGROUP_CONCAT(t1.name), GROUP_CONACT(t2.name)、選択で使用することができます。

于 2012-12-20T14:38:49.580 に答える
2

最もエレガントなものではありません。しかし、それを試してみてください。

クエリ:

select b.userid, x.name1, b.name  as name2
from ranks b
join 
(
select a.userid, min(a.rank), a.name as name1
      from ranks a
      group by a.userid
) as x
on x.userid = b.userid
where (b.userid, b.rank, b.name) not in
(
select a.userid, min(a.rank), a.name
      from ranks a
      group by a.userid
)
group by b.userid
;

結果:

USERID  NAME1   NAME2
1       raj     frank
2       liz     neeta
于 2012-12-20T15:06:05.467 に答える
1

これは同じデータで私のために働いた

SELECT  N1.USERID AS USERID,N1.NAME AS MIN_RANK, N2.NAME AS NEXT_RANK 
FROM (SELECT USERID,NAME FROM TABLE1 WHERE RANK IN(SELECT  Min(Table1.rank) AS MinOfrank FROM Table1 GROUP BY Table1.UserID))  N1,
(SELECT USERID,NAME FROM TABLE1 WHERE RANK IN (SELECT Min(RANK) AS Expr1 FROM TABLE1 WHERE (TABLE1.rank) Not In (SELECT MIN(RANK) FROM TABLE1 GROUP BY USERID)  GROUP BY USERID))  N2 
WHERE
N1.USERID=N2.USERID;

それが役に立てば幸い!!

于 2012-12-20T16:26:39.947 に答える
0

これを試して:

select a.userid , a.name minRank, 
       (select name from usertable where userid =a.userid and rank>a.rank 
        order by rank limit 1) nextMinRank
From (Select userid, name ,rank from usertable order by rank) as a
Group by userid, rank
于 2012-12-20T14:38:44.523 に答える