目前我有:
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很新。
答案 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">
希望这有帮助。