none
SQl查询 RRS feed

  • 问题

  • 比如下表:
    class    text
    1         a
    1         b
    1         c
    2         d
    2         e
    2         f
    3         g
    3         h
    3         i
    查询每个class的前2个信息,即:
    class    text
    1         a
    1         b
    2         d
    2         e
    3         g
    3         f
    sql初学,请问可以如何实现?
    2009年10月18日 11:17

答案

  • 如果是sqlserver2005版本或2005以上版本,可以用rank函数:

    --创建测试环境
    create table Test(class int,[text] varchar(10))
    
    insert into Test(class,[text])
    select	1,'a'
    union all select 1,'b'
    union all select 1,'c'
    union all select 2,'d'
    union all select 2,'e'
    union all select 2,'f'
    union all select 3,'g'
    union all select 3,'h'
    union all select 3,'i'
    
    --用rank函数来查询
    select class,[text]
    from 
    	(select *,rank() OVER (PARTITION BY class order by text) as rank
    	from Test
    	)A
    where A.rank<3
    
    --查询结果
    /*
    	class       text
    	----------- ----------
    	1           a
    	1           b
    	2           d
    	2           e
    	3           g
    	3           h
    
    	(6 行受影响)
    */
    
    • 已标记为答案 WFlash 2009年10月18日 14:21
    2009年10月18日 14:03
    版主

全部回复

  • declare @table table(class varchar(10))
    declare @returnTable table(class varchar(10),[text] varchar(20))
    insert into @table select class from [sql] group by [class]

    declare @c varchar(10)
    declare classCursor cursor for select class from @table

    open classCursor
    fetch next from classCursor into @c
    while @@FETCH_STATUS=0
    begin
    insert into @returnTable select top 2 * from [sql] where class=@c
    fetch next from classCursor into @c
    end
    close classCursor
    deallocate classCursor
    select * from @returnTable


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://blog.tanging.net
    2009年10月18日 12:06
  • 如果是sqlserver2005版本或2005以上版本,可以用rank函数:

    --创建测试环境
    create table Test(class int,[text] varchar(10))
    
    insert into Test(class,[text])
    select	1,'a'
    union all select 1,'b'
    union all select 1,'c'
    union all select 2,'d'
    union all select 2,'e'
    union all select 2,'f'
    union all select 3,'g'
    union all select 3,'h'
    union all select 3,'i'
    
    --用rank函数来查询
    select class,[text]
    from 
    	(select *,rank() OVER (PARTITION BY class order by text) as rank
    	from Test
    	)A
    where A.rank<3
    
    --查询结果
    /*
    	class       text
    	----------- ----------
    	1           a
    	1           b
    	2           d
    	2           e
    	3           g
    	3           h
    
    	(6 行受影响)
    */
    
    • 已标记为答案 WFlash 2009年10月18日 14:21
    2009年10月18日 14:03
    版主
  • 呵呵,太感谢了,值得信赖~
    2009年10月18日 14:22