求排名的SQL

用户积分排行求前100名,名次是并列的。
即:相同积分的用户并列名次,如何查询?

作者: jiajianhui2009   发布时间: 2011-06-01

贴建表及插入记录的SQL,及要求结果出来看看
 思路:
先将所有分数排名,再与工作表连接

作者: wwwwb   发布时间: 2011-06-01

貌似没有sqlserver的并列排名的函数

作者: rucypli   发布时间: 2011-06-01

确实没有,所以要先计算所有分数排名,用变量、查询解决,再与工作表连接

作者: wwwwb   发布时间: 2011-06-01

SQL code
mysql> select * from tab;
+------+-------+
| name | score |
+------+-------+
| A    |    80 |
| B    |    90 |
| C    |    99 |
| D    |    95 |
| E    |    75 |
| F    |    90 |
| G    |    80 |
+------+-------+
7 rows in set (0.00 sec)

mysql> SET @b=0,@c=0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT NAME,score,rank FROM (
    -> SELECT NAME,@a:=score AS score,@b:=IF(@c<>@a,@b+1,@b) AS rank,@c:=@a AS d
ummy
    -> FROM tab ORDER BY score DESC
    -> ) a;
+------+-------+------+
| NAME | score | rank |
+------+-------+------+
| C    |    99 |    1 |
| D    |    95 |    2 |
| B    |    90 |    3 |
| F    |    90 |    3 |
| A    |    80 |    4 |
| G    |    80 |    4 |
| E    |    75 |    5 |
+------+-------+------+
7 rows in set (0.00 sec)

作者: mr_mablevi   发布时间: 2011-06-01

-- ----------------------------
-- Table structure for `tb_user`
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `name` varchar(50) default NULL,
  `score` int(11) default NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'aaa', '150');
INSERT INTO `tb_user` VALUES ('2', 'bbb', '150');
INSERT INTO `tb_user` VALUES ('3', 'ccc', '120');
INSERT INTO `tb_user` VALUES ('4', 'ddd', '100');
INSERT INTO `tb_user` VALUES ('5', 'eee', '90');
INSERT INTO `tb_user` VALUES ('6', 'fff', '90');
INSERT INTO `tb_user` VALUES ('7', 'ggg', '80');
INSERT INTO `tb_user` VALUES ('8', 'hhh', '70');
INSERT INTO `tb_user` VALUES ('9', 'iii', '60');
INSERT INTO `tb_user` VALUES ('10', 'jjj', '50');
INSERT INTO `tb_user` VALUES ('11', 'kkk', '40');
INSERT INTO `tb_user` VALUES ('12', 'lll', '30');


--现在按score列排序,查询前10名

-- -----------------------------------
--名次 用户 分数
-- 1 aaa 150
-- 1 bbb 150
-- 2 ccc 120
-- 3 ddd 100
-- 4 eee 90
-- 4 fff 90
-- 5 ggg 80
-- 6 hhh 70
-- 7 iii 60
-- 8 jjj 50
-- 9 kkk 40
-- 10 lll 30


-- 要求:1.分数相同的并列名次
-- 2.考虑可能用户数量少,排名排不到第10名

作者: jiajianhui2009   发布时间: 2011-06-01