1

現時点で私は持っています:

select username, email
   from memberinfo
   where username = (select username, count(username) as big
                        from rankinginfo
                        group by username
                        order by big desc);

私は最も一般的なユーザー名を返そうとしていますが、これまで count(username) リストに集中してきました。

リストを並べ替えることはできますが、上位の結果を選択する方法がわかりません。

上部に 2 つ (またはそれ以上) のユーザー名がある場合、両方 (すべて) が返されることが非常に重要です。

TOP と LIMIT を使用してみましたが、どちらも成功しませんでした。何か案は?申し訳ありませんが、これは非常に単純でなければならないことを知っていますが、それを理解するのに長い道のりを費やしました。私はSQLが初めてです。

4

3 に答える 3

2

質問のサブクエリは、ユーザー名を 1 つだけ返す必要があります。しかし現在、複数のユーザー名とその数も返しています。このようなものに変更します。

SELECT username
  FROM (SELECT   username, COUNT (username) AS BIG
          FROM rankinginfo
      GROUP BY username
      ORDER BY BIG DESC)
 WHERE ROWNUM = 1

編集: 複数のユーザー間でトップ スポットが同点の場合は、各ユーザーにランクを割り当て、ランク 1 のユーザーを選択する必要があります。

SELECT username, email
  FROM memberinfo
 WHERE username IN (SELECT username
                      FROM (SELECT username, RANK() OVER (ORDER BY COUNT(username) DESC) user_rank
                              FROM rankinginfo
                             GROUP BY username)
                     WHERE user_rank = 1);
于 2013-05-24T12:48:02.453 に答える
0

残念ながら、12cまではOracleに制限はありません:

select username,
       email
from   memberinfo
where  username = (
         select username
         from   (
           select   username
           from     rankinginfo
           group by username
           order by count(*) desc)
         where rownum = 1);
于 2013-05-24T12:46:11.447 に答える
0

これは実際にはウィンドウ関数 (Oracle が分析関数と呼ぶもの) の仕事です。RANK()orを使用DENSE_RANK()して同点を返したりROW_NUMBER()、 の最高値を取得したりしてusername、同点の場合に Oracle が任意に選択できるようにします。COUNT()ウィンドウ関数としても使用することに注意してください。単純な集計を行ったemailとしても、クエリによって返されませんでした。

SELECT * FROM (
    SELECT username, email, username_cnt
         , RANK() OVER ( ORDER BY username_cnt DESC ) AS rn
      FROM (
        SELECT username, email
             , COUNT(*) OVER ( PARTITION BY username ) AS username_cnt
          FROM memberinfo
    )
) WHERE rn = 1;

お役に立てれば。

于 2018-06-05T20:55:21.150 に答える