2017-05-04 46 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位用戶。