日期:2014-05-18  浏览次数:20495 次

求一排名语句!
我有一张1000万条数据的表。格式如下:

CREATE   TABLE   [userinfo]   (
[idx]   [bigint]   IDENTITY   (1,   1)   NOT   NULL   ,
[username]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[password]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[score]   [int]   NOT   NULL   ,
[lvl]   [int]   NOT   NULL   ,
[money]   [int]   NOT   NULL   ,
CONSTRAINT   [PK_userinfo]   PRIMARY   KEY     CLUSTERED  
(
[idx]
)     ON   [PRIMARY]  
)   ON   [PRIMARY]
GO

现在需要实时的计算某人的以score高低排序的前10名和后10名。

比如:输入 'mary '   ,立即计算出以score从高到低排序的在mary前10人和后10人的数据
username         score
.....前10人.....
mary                 100
.....后10人.....


万分感谢各位达人帮忙!!

------解决方案--------------------
Select * From (
Select TOP 10 * From userinfo Where Score > (Select Score From userinfo Where username = 'mary ') Order By Score Desc) A
Union All
Select * From userinfo Where username = 'mary '
Union All
Select * From (
Select TOP 10 * From userinfo Where Score < (Select Score From userinfo Where username = 'mary ') Order By Score) B
------解决方案--------------------
我的作法和 paoluo 一樣。不過在後面的10條數據以降序排列了一下。這樣要是數據多的話看起來會直觀些。
Select * from (
Select top 10 [username],[score] from userinfo
where score> ( Select score from userinfo where username= 'mary ' )
order by score desc ) A
union all
Select username, score from userinfo where username= 'mary '
union all
Select * from(
Select top 10 [username],[score] from userinfo
where score < ( Select score from userinfo where username= 'mary ' )
order by score asc )B
order by Score desc
------解决方案--------------------
CREATE TABLE [userinfo] (
[idx] [bigint] IDENTITY (1, 1) NOT NULL ,
[username] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[password] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[score] [int] NOT NULL ,
[lvl] [int] NOT NULL ,
[money] [int] NOT NULL ,
CONSTRAINT [PK_userinfo] PRIMARY KEY CLUSTERED
(
[idx]
) ON [PRIMARY]
) ON [PRIMARY]


--插入测试49
declare @i int
set @i=1
while 50> @i
begin
insert userinfo(username,score,lvl,[money]) values( 'mary '+rtrim(@i),1,2,2)
set @i=@i+1
end

select * from userinfo--查询
update userinfo set username= 'mary ' where idx=30--更新第30条记录为mary


查询结果:
declare @username varchar(50)
set @username= 'mary '
select * from userinfo
where idx between --少了一个关键字
(select idx-10 from userinfo where username=@username)
and
(select idx+10 from userinfo where username=@username)

idx username password score lvl money
-------------------- -------------------------------------------------- -------------------------------------------------- ----------- ----------- -----------
20 mary20 NULL 1 2 2
21 mary21