比如说有一系列的分值,98、100、97、97、96、89、90、99、85、87、78、83
对这些分值进行排名,从高到底“1~X”名,如果分值相同,这里两个“97”,那么一个第“4”名、一个第“5”名,其它的按顺序排。这样的排序应该怎样实现???如果数据在数据库中,用SQL语句可以实现吗,不使用存储过程的,直接执行“SQL”语句。
查询“分数字段(DF)”,然后直接在结果集对应的“排名字段(PM)”中写入名次,可以吗???
对这些分值进行排名,从高到底“1~X”名,如果分值相同,这里两个“97”,那么一个第“4”名、一个第“5”名,其它的按顺序排。这样的排序应该怎样实现???如果数据在数据库中,用SQL语句可以实现吗,不使用存储过程的,直接执行“SQL”语句。
查询“分数字段(DF)”,然后直接在结果集对应的“排名字段(PM)”中写入名次,可以吗???
CREATE TABLE tb(Name varchar(10),Score decimal(10,2))
INSERT tb SELECT 'aa',99
UNION ALL SELECT 'bb',56
UNION ALL SELECT 'cc',56
UNION ALL SELECT 'dd',77
UNION ALL SELECT 'ee',78
UNION ALL SELECT 'ff',76
UNION ALL SELECT 'gg',78
UNION ALL SELECT 'ff',50
GO--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
--*/
from tb
select ROW_NUMBER() over (order by DF) as [PM],DF from 表 order by DF
--2005;with ach as
(
select *,px=row_number() over (order by 分值 desc)
from tb
)update a
set a.pm = b.px
from tb a join ach b on a.主键 = b.主键--2000select *,rid=identity(int,1,1)
into #tb
from tb
order by 分值 descupdate a
set a.pm = b.rid
from tb a join #tb b on a.主键 = b.主键drop table #tb
from tb
order by DF desc,ID desc
比如说有一系列的分值,98、100、97、97、96、89、90、99、85、87、78、83
对这些分值进行排名,从高到底“1~X”名,如果分值相同,这里两个“97”,那么一个第“4”名、一个第“5”名,其它的按顺序排。这样的排序应该怎样实现???如果数据在数据库中,用SQL语句可以实现吗,不使用存储过程的,直接执行“SQL”语句。
查询“分数字段(DF)”,然后直接在结果集对应的“排名字段(PM)”中写入名次,可以吗??? 如下:
----------------select DF,row_number() OVER(ORDER BY DF DESC) PM
from tb
CREATE TABLE TEST(
DF INT)
INSERT INTO TEST(DF)
SELECT 98
UNION ALL
SELECT 100
UNION ALL
SELECT 97
UNION ALL
SELECT 97
UNION ALL
SELECT 96
UNION ALL
SELECT 89 select DF,row_number() OVER(ORDER BY DF DESC) PM
from TEST
/*
DF PM
----------- --------------------
100 1
98 2
97 3
97 4
96 5
89 6(6 行受影响)
declare @tb TABLE (Name varchar(10),Score decimal(10,2),pm int)
INSERT @tb(Name,Score) SELECT 'aa',99
UNION ALL SELECT 'bb',56
UNION ALL SELECT 'cc',56
UNION ALL SELECT 'dd',77
UNION ALL SELECT 'ee',78
UNION ALL SELECT 'ff',76
UNION ALL SELECT 'gg',78
UNION ALL SELECT 'ff',50
update @tb set pm=c.Place from (
SELECT Name,Score,ROW_NUMBER()over(order by score desc) as Place
FROM @tb a) as c,@tb as d
where d.Name=c.Name
select * from @tb order by pm
-----------------------------------------------------Name Score pm
---------- --------------------------------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 3
dd 77.00 4
bb 56.00 5
cc 56.00 6
ff 50.00 7
(
select ID,px=row_number() over (order by DF desc) from KH_Staff where NF='2011' and YF='8' and BMBH='0007' and BH!='1'
)
update a set a.PM = b.px from KH_Staff a join ach b on a.ID = b.ID