SQL:查询排名

  MySQL语句查询排名

思路:

  先将数据查询出来,按需要排序的字段做好升序(ASC)、降序(DESC),设置好排序的变量:
  1、将已经排好的数据从第一条依次取出来,每取一个数据,排序变量就增加1,直至排序完成:
  (1,2,3,4,5…);
  2、当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加1:
  (1,2,2,3,4…);
  3、当出现相同数据时,排名保持不变,但保持不变的数据仍会占用一个排名位置:
  (1,1,3,4,5…)。

数据准备:

  数据表格式:

CREATE TABLE sql_sort(
    area_id VARCHAR(10),
    num int
);

  表内数据:

INSERT INTO 
    sql_sort
VALUES
    ('a',1),
    ('b',1),
    ('c',1),
    ('d',2),
    ('e',8),
    ('f',12),
    ('g',13),
    ('h',13),
    ('i',16),
    ('j',18);
初表查询
SELECT 
    * 
FROM 
    sql_sort 
GROUP BY 
    area_id
ORDER BY
    num;

初表查询

思路1:

  不论数据是否相同,始终依次排序。
  (1,2,3,4,5,6,7…)

SELECT
    area_id,
    num,
    @rownum := @rownum + 1 AS num_tmp
FROM
    sql_sort,
    (SELECT @rownum := 0) r
GROUP BY
    area_id;

执行结果如图:
思路1

思路2:

  只要数据有相同的排名就一样,排名依次排序。
  (1,1,2,3,4,4,5…)

SELECT
    area_id,
    num,
    CASE 
        WHEN @rowtotal = num THEN @rownum
        WHEN @rowtotal := num THEN @rownum := @rownum + 1
        WHEN @rowtotal := 0 THEN @rownum := @rownum +1
    END AS rownum
FROM
    sql_sort,
    (SELECT  @rownum := 0 ,@rowtotal := NULL) r
GROUP BY
    area_id;

执行结果如图:
思路2

思路3:

  只要数据有相同的排名就一样,但是相同排名也占位,排名依次排序。
  (1,1,3,4,5,5,7…)

SELECT
    area_id,
    num,
    @rownum := @rownum + 1 AS num_tmp,
    @incrnum := CASE
        WHEN @rowtotal = num THEN @incrnum
        WHEN @rowtotal := num THEN @rownum
    END rownum
FROM
    sql_sort,
    (SELECT  @rownum := 0 ,@rowtotal := NULL ,@incrnum := 0) r
GROUP BY
    area_id;

  执行结果如图:
思路3

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值