【问题标题】:Rank sql columns对 sql 列进行排名
【发布时间】:2014-01-17 09:11:04
【问题描述】:

我有这样的表:

+--------+--------+--------+
| color  | fruit  | amount |
+--------+--------+--------+
| red    | cherry |    124 |
| red    | plum   |     23 |
| green  | gauva  |    119 |
| green  | pear   |     14 |
| orange | orange |     23 |
+--------+--------+--------+

我希望它像这样添加排名。

 +------+--------+--------+--------+
 | rank | color  | fruit  | amount |
 +------+--------+--------+--------+
 |    1 | red    | cherry |    124 |
 |    2 | red    | plum   |     23 |
 |    1 | green  | gauva  |    119 |
 |    2 | green  | pear   |     14 |
 |    1 | orange | orange |     23 |
 +------+--------+--------+--------+

我需要根据每种颜色的数量(单独)对其进行排名。 这可能吗?

【问题讨论】:

标签: mysql sql


【解决方案1】:
select
color, fruit, amount,
case when (if(@prev_color != color, @rank:=1, @rank:=@rank + 1)) is null then null
     when (@prev_color := color) is null then null
else @rank end as rank
from your_table
, (select @rank:=0, @prev_color := null) v
order by color, amount desc

【讨论】:

    【解决方案2】:

    如果排名是根据color 的高amount 可用性给出的,那么您还可以找到少于或多于amount 值的行数。该行数将是相关colorrank

    select
     ( select count( color ) from fruits_table 
       where color = f.color and amount >= f.amount
     ) as 'rank',
     color, fruit, amount 
    from fruits_table f
    order by color, amount desc
    -- order by field( color, 'red', 'green', 'orange' ), amount desc
    ;
    

    您可以使用field 函数通过color 更改字段的顺序以根据需要显示在顶部或底部。请参阅上面注释的 order by 子句。

    【讨论】:

      【解决方案3】:

      试试这个

      SELECT  @row_num := IF(@prev_value=o.Customer,@row_num+1,1) AS RowNumber
             ,colour
             ,fruit
             ,amount
             ,@prev_value := colour
        FROM Table1,
            (SELECT @row_num := 1) x,
            (SELECT @prev_value := '') y
        ORDER BY colour,amount DESC
      

      【讨论】:

        【解决方案4】:

        尝试使用行号函数,您可以在其中指定从哪里开始然后编号(分区依据)以及如何组织该分区内的行(排序依据)。

         | rank | color  | fruit  | amount |
         +------+--------+--------+--------+
         |    1 | red    | cherry |    124 |
         |    2 | red    | plum   |     23 |
         |    1 | green  | gauva  |    119 |
         |    2 | green  | pear   |     14 |
         |    1 | orange | orange |     23 |
         +------+--------+--------+--------+
        
        select distinct 
          row_number() over (partition by color order by amount desc) rank,
          color,
          fruit,
          amount
        from
          foo
        order by
          color, amount desc
        

        您会发现行编号从每种新颜色重新开始,并且在每种颜色中,行将按降序排列的数量排序。

        【讨论】:

        • 问题标记为 MySQL。但是,这个答案似乎不在 MySQL 中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-04
        • 1970-01-01
        相关资源
        最近更新 更多