2015-10-04 28 views
0

我想獲得列總和的排名,但也按類別分組。根據多個類別的列總和獲得排名

表是這樣的:

user_id | category_id | number 
    1   1  10.00 
    1   1  15.00 
    1   2  12.00 
    1   2  10.00 
    2   1  23.00 
    2   1  12.50 
    2   2  20.50 
    2   2  19.50 
    3   1  15.00 
    3   1  17.50 
    3   2  10.50 
    3   2  19.50 

我需要的是按類別進行總結數列和等級,並設置結果的限制。

所以,我要的是這個落得:

user_id | category_id | total | rank 
    2   1  35.50 1 
    3   1  32.50 2  
    1   1  25.00 3 
    2   2  40.00 1 
    3   2  30.00 2 
    1   2  22.00 3 

在這個例子中,我展示了前3名的排名。

+1

您對結果集數據採樣不符合樣本輸入。真的很難理解你想要達到的目標。 –

+1

樣本數據具有數字列,每個用戶,每個類別的總和,並按該總和排序。我會更新這些示例以更精確地表示。 –

回答

1

您可以使用一個簡單的GROUP BY條款,讓每user_idnumber總和,category_id

SELECT user_id, category_id, SUM(number) AS total 
FROM mytable 
GROUP BY user_id, category_id 

按類別要獲得排名,您可以使用變量,並將它們應用到上述查詢,如下所示:

SELECT user_id, category_id, total,  
     @rn := IF (@cat = category_id, 
       IF (@cat := category_id, @rn + 1, @rn + 1), 
       IF (@cat := category_id, 1, 1)) AS rank 
FROM (     
    SELECT user_id, category_id, SUM(number) AS total 
    FROM mytable 
    GROUP BY user_id, category_id) AS t 
CROSS JOIN (SELECT @rn := 0, @cat := 0) AS var 
ORDER BY category_id, total DESC 

Demo here

如果你想過濾由等級和顯示o結果只有排名前3的排名,那麼您可以將上述內容包裝在子查詢中,並使用外部查詢:

SELECT user_id, category_id, total, rank 
FROM (... above query here ...) AS s 
WHERE s.rank <= 3