Mysql - 计算按两列分组的排名

标签 mysql group-by

我有一个像这样的 mysql 表:

          Tbl
[Username   Number  Type]
  manos       5       A
  manos       6       B
  maria       2       A
  maria       3       B
  maria       1       C
  nick        7       A
  nick        4       C
  aaron       8       A

我想创建一个 View ,其中将显示每个用户的排名(按较大的数字),按类型分组,并与每种类型中的其他用户进行比较。更具体地说,我希望输出为:

[Username     Rank   Type]
   manos       3       A
   manos       1       B
   maria       4       A
   maria       2       B
   maria       2       C
   nick        2       A
   nick        1       C
   aaron       1       A

我尝试过以下方法:

 select Username, count(*) as Rank, Type
 from Tbl as aw
 where
    Number <= (
       select Number
       from Tbl
       where Type = aw.Type
    )
 group by Username, Type

结果是我收到子查询返回超过 1 行错误。

如有任何帮助,我们将不胜感激!

编辑:按照建议更改列名称。还有一个 fiddle 来帮助:http://sqlfiddle.com/#!9/55ec3f

编辑2:对“所有组合排名”的一些澄清和更正。 假设我们有另一个名为 Teams 的表:

          Teams
[Username   Team]
  manos       T1 
  manos       T2
  maria       T1
  maria       T2
  nick        T1
  nick        T2
  aaron       T3

在这种情况下,我想提取组和类型的每个组合的排名,即对于 Manos,我想要:

  • 与 T1 类型 A 的人进行排名
  • 与 T2 类型 A 的人进行排名
  • 与 T1 中 B 型人的排名
  • 与 T2 中 B 型人的排名
  • 与 T1 和 T2 中 A 类型的人进行排名
  • 与 T1 和 T2 中 B 型人员的排名

最佳答案

为了保持理智,我重命名了您的group列...

   SELECT username
     , user_group
     , number
     , CASE WHEN @prev=user_group THEN @i:=@i+1 ELSE @i:=1 END rank
     , @prev:=user_group 
  FROM my_table x
     , (SELECT @prev:=null, @i:=0) vars 
 ORDER 
    BY user_group
     , number DESC;

关于Mysql - 计算按两列分组的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46359811/

相关文章:

php - Yii 查询生成器嵌套条件

php - MySQL InnoDB 事务回滚不起作用

mysql - 如果存在,如何删除表 ___;作品?

mysql - mysql 中 int(11) 列的大小是多少(以字节为单位)?

php - 选择 Doctrine (Symfony 2) 中一列为 false 的所有内容

SQL Server - 按不同列的值分组

mysql - 在一行中加入列

Mysql查询-分组结果

MySQL - 条件来自右表的连接行

mysql - 对行进行分组并对每个组进行排序