按周排名按组排名

时间:2014-02-10 08:51:07

标签: mysql

我试图从我的数据集中获取每周排名类型的结果,并且使用多种技术失败。

我的数据如下:

+------------+------+--------+
| team       | week |points  |
+------------+------+--------+
| blue       |   1  | 10     | 
| green      |   1  | 15     |
| red        |   1  | 16     |
| blue       |   2  | 5      |
| green      |   2  | 18     |
| red        |   2  | 6      |
| blue       |   3  | 2      |
| green      |   3  | 8      |
| red        |   3  | 8      |
+------------+------+--------+

我正试图得到这样的东西:

+------------+------+--------+
| team       | week | rank   | 
+------------+------+--------+
| blue       |   1  | 3      | 
| green      |   1  | 2      |
| red        |   1  | 1      |
| blue       |   2  | 3      |
| green      |   2  | 1      |
| red        |   2  | 2      |
| blue       |   3  | 3      |
| green      |   3  | 1      |
| red        |   3  | 1      |
+------------+------+--------+

你可以在第3周看到分数是并列的,所以排名也需要联系起来。并列排名始终是值中的较低者。 (即联合第2名将总是排名2 2而不是3 3)。

它可以是存储过程,视图,任何东西。但它需要是MySql。

到目前为止,我有这个:

SELECT team, 
@rnk:= CASE 
    WHEN @week_id <> week THEN 0
    WHEN points = @tot THEN @rnk
    ELSE @rnk+1 
END 
AS rank,
@week_id := week AS wk,
@tot := points AS pts
FROM
  (SELECT @rnk:= -1) s,
  (SELECT @week_id:= -1) c,
  (SELECT *
   FROM v_weeklypointtotals
   ORDER BY week, points DESC
  ) t

但是,从MySql工作台调用它时效果很好。但是当通过PHP调用它时会得到不正确的结果。 (它没有考虑到并列的周数)。我认为这可能与变量设置的顺序有关......但我很难过。

2 个答案:

答案 0 :(得分:3)

试试这个:

select team,week,
(select count(*)+1 from Table1 where week=t1.week
                                and points >t1.points ) as rank
FROM Table1 t1

SQLFiddle demo

答案 1 :(得分:-1)

顺便说一句,如果你没有费心去查看我在评论中链接的SO帖子你可以试试这个魔法:)

SELECT    ( 
            CASE Week 
            WHEN @curW 
            THEN @curRow := @curRow + 1 
            ELSE @curRow := 1 AND @curW := Week END
          ) + 1 AS rank,
          Week,
          team,
          points
FROM      tablename,
          (SELECT @curRow := 0, @curW := 0) r
ORDER BY  Week DESC, points DESC;