oracle sql开发人员最常见的值与关系

时间:2013-05-24 12:29:41

标签: sql oracle

目前我有:

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很新。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);

答案 2 :(得分:0)

这确实是窗口函数的工作(Oracle称之为分析函数)。您可以使用DENSE_RANK()ROW_NUMBER()返回关联,或使用username获取COUNT()的最高值,以便Oracle在关联时可以任意选择。请注意,我还使用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; ,我会做简单的聚合。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:paddingBottom="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="5dp"
tools:context="com.example.leoconnelly.connexus.MainActivity">

希望这有帮助。