2017-05-04 32 views
0

我有表USERSREPORTS。在REPORTS表中,我有一列user_id,所以我可以计算用户给出了多少报告。我想要做的是获得报告数量最多的前10名用户。在ORDER BY子句中使用SQL查询

我想到了一个查询:

SELECT 
    * 
FROM 
    (SELECT users.id 
    FROM users 
    ORDER BY (SELECT count(*) 
       FROM reports 
       WHERE user_id = "users.id") DESC) 
WHERE 
    ROWNUM <= 10; 

但是,我不知道如何使用从主查询到子查询返回的ID。

我使用Oracle 11g。

后来编辑 我设法与GROUP结果排序:

SELECT * FROM(SELECT user_id, count(*) as count1 FROM reports GROUP BY  
user_id ORDER BY count1 DESC) WHERE ROWNUM <= 10 

回答

0

对不起这应该工作

SELECT * 
FROM sometable 
ORDER BY name 
FETCH FIRST 10 ROWS ONLY 
+0

我认为在oracle中,LIMIT不起作用! :) – Daniel

+0

对不起!我读得太快了,让我知道如果这是有效的 –

+0

'先取第一个'只适用于Oracle 12,而不适用于旧版Oracle 11 Daniel正在使用 –

0
SELECT * 
FROM (
    SELECT u.id 
    FROM users u 
     INNER JOIN 
     (
      SELECT user_id, 
        count(*) AS num_reports 
      FROM reports 
      GROUP BY user_id 
     ) r 
     ON (u.id = r.user_id) 
    ORDER BY r.num_reports DESC 
) 
WHERE ROWNUM <= 10; 

,或者更简单地说:

SELECT * 
FROM (
    SELECT user_id 
    FROM reports 
    GROUP BY user_id 
    ORDER BY COUNT(*) DESC 
) 
WHERE ROWNUM <= 10; 
1

这可以通过用一个窗函数组合group by来完成:

select u.*, r.num_reports 
from users u 
    join (
    select user_id, 
      count(*) as num_reports, 
      dense_rank() over (order by count(*) desc) as rnk 
    from reports 
    group by user_id 
) r on u.id = r.user_id and r.rnk <= 10 
order by r.num_reports desc; 

派生表(“内部”选择)计算每个用户的报告的数目和也居基于报告的数目的那些行。最高的数字将获得排名= 1,次高2等等。排名高于10的用户将在连接条件中被过滤掉。请注意,如果“前10名”中具有相同数量的报告的用户存在,这可能会返回超过10位用户。