日期:2014-05-19  浏览次数:20458 次

请教一个关于排名的问题,看大家有没有想过这个问题
create   table   Scores
(
    id   int   identity(1,1)   primary   key,
    XingMing   varchar(20)   not   null,
    Score   int   not   null
)

insert   Scores   select   '陈七 ',100
insert   Scores   select   '黄八 ',80
insert   Scores   select   '莉莉 ',90
insert   Scores   select   '李四 ',90
insert   Scores   select   '张三 ',50

select   *   from   Scores

select   *,[排名]=(select   count(*)   from   Scores   where   tmp.Score <=Score)   from   Scores   tmp


drop   table   Scores

下面是我执行的结果,但是我想因为莉莉和李四都是第3,那么习惯上张三就应该是6了,这个该如何实现呢
1 陈七 100 1
2 黄八 80 4
3 莉莉 90 3
4 李四 90 3
5 张三 50 5

最终想要的结果
1 陈七 100 1
2 黄八 80 4
3 莉莉 90 3
4 李四 90 3
5 张三 50 6


------解决方案--------------------
select *,[排名]=(select count(*)+1 from Scores where tmp.Score <Score and tmp.id <> id) from Scores tmp

id XingMing Score 排名
----------- -------------------- ----------- -----------
1 陈七 100 1
2 黄八 80 4
3 莉莉 90 2
4 李四 90 2
5 张三 50 5
drop table Scores

------解决方案--------------------
--try


select *,[排名]=(select count(*)+1 from Scores where tmp.Score <Score) from Scores tmp
------解决方案--------------------
表jh03有下列数据:
name score
aa  99
bb  56
cc  56
dd  77
ee  78
ff  76
gg  78
ff  50

1. 名次生成方式1,Score重复时合并名次
SELECT * , Place=(SELECT COUNT(DISTINCT Score) FROM jh03 WHERE Score > = a.Score)
FROM jh03 a
ORDER BY Place
结果
Name Score Place
---------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 3
ff 76.00 4
bb 56.00 5
cc 56.00 5
ff 50.00 6

2. 名次生成方式2 , Score重复时保留名次空缺
SELECT * , Place=(SELECT COUNT(Score) FROM jh03 WHERE Score > a.Score) + 1
FROM jh03 a
ORDER BY Place
结果
Name Score Place
--------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 4
ff 76.00 5
bb 56.00 6
cc 56.00 6
ff 50.00 8