• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

紫の焰

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

[原创]一道京东商城的面试题的解决方法

题目

数据表结构为

create table Ques1

(
 id int identity(1,1) primary key,--主键
 [Name] nvarchar(50) not null,--学生姓名
 Score int not null,--学生成绩
 Class int not null--学生班级
)

 

要查询每班前两名学生的信息

 

use db20110107
--定义临时表以存储结果
create table #TempResultTable
(
 id int,
 [Name] nvarchar(50),
 Score int,
 Class int
)
--定义游标
declare Cursor_SelectResult cursor for
 select * from Ques1 order by class asc,score desc
--打开游标
open Cursor_SelectResult

declare @id int,@Name nvarchar(50),@Score int,@Class int --接受记录字段的变量
declare @dealedThisClassStudents int,@dealedCurrentClass int
set @dealedThisClassStudents = 0
set @dealedCurrentClass = -1


fetch Cursor_SelectResult into  @id,@name,@Score,@Class

while(@@fetch_status=0)
begin
 print(Convert(nvarchar(50),@id)+'---'+@name+'---'+Convert(nvarchar(50),@score)+'---'+Convert(nvarchar(50),@class))
  
 if(@class=@dealedCurrentClass)
 begin
  if(@dealedThisClassStudents<2)
  begin
   insert into #TempResultTable values(@id,@name,@Score,@Class)
   set @dealedThisClassStudents = @dealedThisClassStudents + 1
   print('该条已经插入')
  end
  else if(@dealedThisClassStudents>=2)
  begin
   set @dealedThisClassStudents = @dealedThisClassStudents + 1
  end
 end
 else if(@class != @dealedCurrentClass)
 begin
  set @dealedCurrentClass = @class
  set @dealedThisClassStudents = 0
  insert into #TempResultTable values(@id,@name,@Score,@Class)
  print('该条已经插入')
  set @dealedThisClassStudents = @dealedThisClassStudents + 1
 end
 fetch Cursor_SelectResult into  @id,@name,@Score,@Class
 
end
close Cursor_SelectResult
deallocate Cursor_SelectResult

select * from #TempResultTable
drop table #TempResultTable

 

 还有一个方法,我只是想了一下思路,可以行得通.

大体思想为

把每个班人数取到一张表里

就像

classnum    studentsnum

1                        4

2                        3

3                        4

 

然后通过select row_number() over (order by class asc,score desc) as rowid,* from Ques1 order by class asc,score desc   (表2-1)取得每班为组的成绩倒序排列的信息,并为其添加递增为1的列ID

 

所有班的第一名的在上表中的rowid为

classnum    studentsnum      第一名rowid      第二名rowid

1                        4      1         2

2                        3      1+4=5      2+4=6

3                        4      5+3=8      6+3=9

4         1      8+4=12      -1

如果当前班级studentsnum<2的话,根据情况判断,不要生成上述规则的 rowid,改为-1

这样能取出所有班级第一名第二名学生的ID.

然后再(表2-1)中选择相应rowid就可得出相应学生信息.

 

如果大家有更好的办法欢迎和大家一起分享,请留言.万分感谢

posted on 2011-01-08 00:28  紫の焰  阅读(3224)  评论(4)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3