【mysql、sqlserver 4种分组排序函数dense_rank / row_number / rank / ntile】

mysql高版本版本以上才支持函数(5.0+不支持),sqlserver原则上和mysql函数一致,以下截图来自sqlserver(2019)

--row_number()【概要:不考虑重复值】
--score的排序规则自然递增(不区分score重复)
select *,row_number() over(order by score desc) as 'row_number' from testuser;

 --以subject分组,组内score的排序规则自然顺序递增(不区分score相同情况)
select *,row_number() over(partition by subject order by score desc) as 'row_number' from testuser;

--dense_rank()【概要:考虑重复值,序号不间隔】
--score的排序规则递增(相同score序号一致,不同score需要自然递增,无序号间隔)
select *,dense_rank() over(order by score desc) as 'dense_rank' from testuser; 

--以subject分组,组内score的排序规则自然顺序递增(相同score序号一致,不同score需要自然递增,无序号间隔)
select *,dense_rank() over(partition by subject order by score desc) as 'dense_rank' from testuser;

--rank()【概要:考虑重复值,序号间隔】
--score的排序规则递增(相同score序号一致,不同score需要占位递增,序号存在间隔)
select *,rank() over(order by score desc) as 'rank' from testuser;

--以subject分组,组内score的排序规则自然顺序递增(相同score序号一致,不同score需要自然递增,存在序号间隔)
select *,rank() over(partition by subject order by score desc) as 'rank' from testuser;

--ntile()【概要:分组使用,区别于上面三种】
--按照排序规则分组,“ntile(3)”括号必须传值,分组数依托此参数
select *,ntile(4) over(order by score desc) as 'ntile' from testuser;

--先按照subject分组,如果分组数小于括号传值,则按照最小分组数
select *,ntile(4) over(partition by subject order by score desc) as 'ntile' from testuser;

 补充:

因为没找到自己满意的材料,自己整理发布,仅供参考,不喜勿喷

DDL语句:

DROP TABLE IF EXISTS `testuser`;
CREATE TABLE `testuser`  (
  `user_id` int NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `score` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `subject` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;

DML语句:

INSERT INTO `sortFunction` (`user_id`, `user_name`, `score`, `subject`) VALUES (1, 'jame', '80', 'chinese');
INSERT INTO `sortFunction` (`user_id`, `user_name`, `score`, `subject`) VALUES (2, 'tom', '90', 'english');
INSERT INTO `sortFunction` (`user_id`, `user_name`, `score`, `subject`) VALUES (3, 'lucy', '80', 'english');
INSERT INTO `sortFunction` (`user_id`, `user_name`, `score`, `subject`) VALUES (4, 'kate', '70', 'psychology');
INSERT INTO `sortFunction` (`user_id`, `user_name`, `score`, `subject`) VALUES (5, 'jack', '70', 'psychology');
INSERT INTO `sortFunction` (`user_id`, `user_name`, `score`, `subject`) VALUES (6, 'tip', '60', 'psychology');

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值