CREATE TABLE tb(Name varchar(10),Score decimal(10,2))INSERT tb SELECT 'aa',99UNION ALL SELECT 'bb',56UNION ALL SELECT 'cc',56UNION ALL SELECT 'dd',77UNION ALL SELECT 'ee',78UNION ALL SELECT 'ff',76UNION ALL SELECT 'gg',78UNION ALL SELECT 'ff',50GO--1. 名次生成方式1,Score重复时合并名次SELECT *,Place=(SELECT COUNT(DISTINCT Score) FROM tb WHERE Score>=a.Score)FROM tb aORDER BY Place/*--结果Name Score Place ---------------- ----------------- ----------- aa 99.00 1ee 78.00 2gg 78.00 2dd 77.00 3ff 76.00 4bb 56.00 5cc 56.00 5ff 50.00 6SELECT COUNT(DISTINCT Score) FROM tb WHERE Score>=a.Score) 这句语句 有谁能帮帮我吗每次 查询 比当条 积分大的或者等于的记录数,如果是 sql 2005,可以直接使用排名函数,更好理解
SELECT *,Place=DENSE_RANK() OVER(ORDER BY score DESC)FROM tb aORDER BY Place额,就是查score的重复次数条件是Score>=a.score
COUNT(DISTINCT Score) :DISTINCT Score 取出重复的Score
一起就表示去除重复Score的个数
最终结果赋值给Place
明白了吧
每条记录的tatalScore列与整体列totalScore比较;
一次比较就会得出一条或多条记录,如果是一条记录就表示是第一名,
二条记录就表示是第二名,..........
但是会遇到重复数据,所以就加个DISTNCT 来抑制重复。