当前位置: > 数据库 > SQL Server 2005 >

在select中添加排名列的SQL语句

时间:2015-05-11 03:10来源:linux.it.net.cn 作者:IT

SELECT *,'名次'=(SELECT COUNT(DISTINCT B.num) FROM a B WHERE B.num>=A.num)
FROM a A
ORDER BY num desc

 

 

http://www.cnblogs.com/zengxiangzhan/archive/2009/09/23/1572290.html

结构为
user scores
1      80
2     7
3     99
4     58
..

比如我想计算user=4在此表中的排名应该如何做?

SELECT COUNT* ) FROM user_test WHERE scores >= ( SELECT scores FROM user_test 
WHERE user =4 ) 


--参数说明:
--sc 表名
--name 人名
--mark 分数
--ord 名次

1、并列,有空档,名次是不连续的(有两个第二名,接下来的就是第四名)。
update sc set ord=(select count(*)+1 from sc B where B.mark>sc.mark)
说明:其实就是求出分数比他多的人数,再加上1。


2、并列,无空档,名次总是连续的
update sc set ord=(select count(*from (select distinct mark from sc) as distmark where distmark.mark >=sc.mark)
说明:select distinct mark from sc 是求出不重复的分数,然后看你的分数排在哪个位置。
 

 

--1. 名次生成方式1,Score重复时合并名次
SELECT *,Place=(SELECT COUNT(DISTINCT Score) FROM tb WHERE Score>=a.Score)
FROM tb 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 tb WHERE Score>a.Score)+1
FROM tb 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
--
*/



(责任编辑:IT)
------分隔线----------------------------