1

目前我有:

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

我正在尝试返回最常见的用户名,并且到目前为止一直专注于计数(用户名)列表。

我可以订购列表,但我似乎无法弄清楚如何挑选出最佳结果。

如果顶部有 2 个(或更多)用户名,那么它们都(全部)返回,这一点非常重要。

我试过使用 TOP 和 LIMIT 但都没有成功。有任何想法吗?抱歉,我知道这一定非常简单,但我花了很长时间试图弄清楚。我对 SQL 很陌生。

4

3 回答 3

2

您问题中的子查询应该只返回一个用户名。但目前它正在返回多个用户名及其计数。把它修改成这样。

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()orDENSE_RANK()来返回 tie,或者ROW_NUMBER()获取 的最高值username,让 Oracle 在出现 tie 的情况下任意选择。请注意,我也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 回答