结构为

user scores

1      80

2     7

3     99

4     58

排名 sql_sql排名..


比如我想计算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

--*/