ID号 姓名 学校65 苏国清 南京市合川小学
406 刘昊斌 南京市合川小学
427 高峰 南京市合川小学444 庞春云 南京市广盛小学
478 方富贵 南京市广盛小学
480 刘铭 南京市广盛小学
565 杨林 南京市广盛小学655 张红艳 南京市汉衡小学
921 邹忠臣 南京市汉衡小学935 吴运新 南京市国联小学
965 赵刚 南京市国联小学
999 王志宏 南京市国联小学
1099 王军 南京市国联小学
2559 王宇 南京市国联小学290608 丛志波 南京市方正小学293546 朱东兴 南京市合川小学

解决方案 »

  1.   


    ---------------------------------
    --  Author: htl258(Tony)
    --  Date  : 2009-08-09 21:04:33
    ---------------------------------
    --> 生成测试数据表:tbIf not object_id('[tb]') is null
    Drop table [tb]
    Go
    Create table [tb]([ID号] int,[姓名] nvarchar(3),[学校] nvarchar(7))
    Insert tb
    Select 65,'苏国清','南京市合川小学' union all
    Select 406,'刘昊斌','南京市合川小学' union all
    Select 427,'高峰','南京市合川小学' union all
    Select 444,'庞春云','南京市广盛小学' union all
    Select 478,'方富贵','南京市广盛小学' union all
    Select 480,'刘铭','南京市广盛小学' union all
    Select 565,'杨林','南京市广盛小学' union all
    Select 655,'张红艳','南京市汉衡小学' union all
    Select 921,'邹忠臣','南京市汉衡小学' union all
    Select 935,'吴运新','南京市国联小学' union all
    Select 965,'赵刚','南京市国联小学' union all
    Select 999,'王志宏','南京市国联小学' union all
    Select 1099,'王军','南京市国联小学' union all
    Select 2559,'王宇','南京市国联小学' union all
    Select 290608,'丛志波','南京市方正小学' union all
    Select 293546,'朱东兴','南京市合川小学'
    Go
    --Select * from tb-->SQL查询如下:
    select *
    from tb t
    where [ID号] in(
    select top 2 [ID号]
    from tb 
    where [学校]=t.[学校])
    /*
    ID号         姓名   学校
    ----------- ---- -------
    65          苏国清  南京市合川小学
    406         刘昊斌  南京市合川小学
    444         庞春云  南京市广盛小学
    478         方富贵  南京市广盛小学
    655         张红艳  南京市汉衡小学
    921         邹忠臣  南京市汉衡小学
    935         吴运新  南京市国联小学
    965         赵刚   南京市国联小学
    290608      丛志波  南京市方正小学(9 行受影响)
    */
      

  2.   

    select * into # from tb t where not exists(select * from tb where t.学校=学校 and t.姓名=姓名 and t.id>ID)
    select * 
    from # k
    where id in (select top 2 ID from # where k.学校=学校 order by ID  )
      

  3.   

    If object_id('[tb]') is  not null
        Drop table [tb]
    Go
    Create table [tb]([ID] int,[姓名] nvarchar(3),[学校] nvarchar(7))
    Insert tb
    Select 65,'苏国清','南京市合川小学' union all
    Select 406,'刘昊斌','南京市合川小学' union all
    Select 427,'高峰','南京市合川小学' union all
    Select 444,'庞春云','南京市广盛小学' union all
    Select 478,'方富贵','南京市广盛小学' union all
    Select 480,'刘铭','南京市广盛小学' union all
    Select 565,'杨林','南京市广盛小学' union all
    Select 655,'张红艳','南京市汉衡小学' union all
    Select 921,'邹忠臣','南京市汉衡小学' union all
    Select 935,'吴运新','南京市国联小学' union all
    Select 965,'赵刚','南京市国联小学' union all
    Select 999,'王志宏','南京市国联小学' union all
    Select 1099,'王军','南京市国联小学' union all
    Select 2559,'王宇','南京市国联小学' union all
    Select 290608,'丛志波','南京市方正小学' union all
    Select 293546,'朱东兴','南京市合川小学'
    Go
    select * into # from tb t where not exists(select * from tb where t.学校=学校 and t.姓名=姓名 and t.id>ID)
    select * 
    from # k
    where id in (select top 2 ID from # where k.学校=学校 order by ID  )/*
    (16 行受影响)(16 行受影响)
    ID          姓名   学校
    ----------- ---- -------
    65          苏国清  南京市合川小学
    406         刘昊斌  南京市合川小学
    444         庞春云  南京市广盛小学
    478         方富贵  南京市广盛小学
    655         张红艳  南京市汉衡小学
    921         邹忠臣  南京市汉衡小学
    935         吴运新  南京市国联小学
    965         赵刚   南京市国联小学
    290608      丛志波  南京市方正小学
    */
      

  4.   

    若要按ID号升序,再加一下ORDER BY ID号
    select *
    from tb t
    where [ID号] in(
    select top 2 [ID号]
    from tb 
    where [学校]=t.[学校]
    order by [ID号])
      

  5.   

    ---------------------------------
    --  Author: liangCK 小梁
    --  Title : 查每个分组前N条记录
    --  Date  : 2008-11-13 17:19:23
    -----------------------------------> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date DATETIME)
    INSERT INTO #T
    SELECT '001',1,'邹建','深入浅出SQLServer2005开发管理与应用实例','2008-05-10' UNION ALL
    SELECT '002',1,'胡百敬','SQLServer2005性能调校','2008-03-22' UNION ALL
    SELECT '003',1,'格罗夫Groff.J.R.','SQL完全手册','2009-07-01' UNION ALL
    SELECT '004',1,'KalenDelaney','SQLServer2005技术内幕存储引擎','2008-08-01' UNION ALL
    SELECT '005',2,'Alex.Kriegel.Boris.M.Trukhnov','SQL宝典','2007-10-05' UNION ALL
    SELECT '006',2,'飞思科技产品研发中心','SQLServer2000高级管理与开发','2007-09-10' UNION ALL
    SELECT '007',2,'胡百敬','SQLServer2005数据库开发详解','2008-06-15' UNION ALL
    SELECT '008',3,'陈浩奎','SQLServer2000存储过程与XML编程','2005-09-01' UNION ALL
    SELECT '009',3,'赵松涛','SQLServer2005系统管理实录','2008-10-01' UNION ALL
    SELECT '010',3,'黄占涛','SQL技术手册','2006-01-01'--SQL查询如下:--按GID分组,查每个分组中Date最新的前2条记录
    --1.字段ID唯一时:
    SELECT * FROM #T AS T WHERE ID IN(SELECT TOP 2 ID FROM #T WHERE GID=T.GID ORDER BY Date DESC)--2.如果ID不唯一时:
    SELECT * FROM #T AS T WHERE 2>(SELECT COUNT(*) FROM #T WHERE GID=T.GID AND Date>T.Date)--SQL Server 2005 使用新方法--3.使用ROW_NUMBER()进行排位分组
    SELECT ID,GID,Author,Title,Date
    FROM
    (
       SELECT rid=ROW_NUMBER() OVER(PARTITION BY GID ORDER BY Date DESC),*
       FROM #T
    ) AS T
    WHERE rid<=2--4.使用APPLY
    SELECT DISTINCT b.*
    FROM #T AS a
    CROSS APPLY
    (
        SELECT TOP(2) * FROM #T WHERE a.GID=GID ORDER BY Date DESC
    ) AS b
    --结果
    /*ID   GID         Author                        Title                                   Date
    ---- ----------- ----------------------------- --------------------------------------- -----------------------
    003  1           格罗夫Groff.J.R.                 SQL完全手册                                 2009-07-01 00:00:00.000
    004  1           KalenDelaney                  SQLServer2005技术内幕存储引擎                   2008-08-01 00:00:00.000
    005  2           Alex.Kriegel.Boris.M.Trukhnov SQL宝典                                   2007-10-05 00:00:00.000
    007  2           胡百敬                           SQLServer2005数据库开发详解                    2008-06-15 00:00:00.000
    009  3           赵松涛                           SQLServer2005系统管理实录                     2008-10-01 00:00:00.000
    010  3           黄占涛                           SQL技术手册                                 2006-01-01 00:00:00.000(6 行受影响)
    */
      

  6.   

    ----------------------------------------------------------------
    -- Author :fredrickhu(小F 向高手学习)
    -- Date   :2009-08-09 21:09:44
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([ID号] int,[姓名] varchar(6),[学校] varchar(14))
    insert [tb]
    select 65,'苏国清','南京市合川小学' union all
    select 406,'刘昊斌','南京市合川小学' union all
    select 427,'高峰','南京市合川小学' union all
    select 444,'庞春云','南京市广盛小学' union all
    select 478,'方富贵','南京市广盛小学' union all
    select 480,'刘铭','南京市广盛小学' union all
    select 565,'杨林','南京市广盛小学' union all
    select 655,'张红艳','南京市汉衡小学' union all
    select 921,'邹忠臣','南京市汉衡小学' union all
    select 935,'吴运新','南京市国联小学' union all
    select 965,'赵刚','南京市国联小学' union all
    select 999,'王志宏','南京市国联小学' union all
    select 1099,'王军','南京市国联小学' union all
    select 2559,'王宇','南京市国联小学' union all
    select 290608,'丛志波','南京市方正小学' union all
    select 293546,'朱东兴','南京市合川小学'
    --------------开始查询--------------------------
    select 
       * 
    from 
       tb t
    where 
       [ID号] 
    in
    (select top 2 [ID号] from tb where [学校]=t.[学校])----------------结果----------------------------
    /*
    ID号         姓名     学校             
    ----------- ------ -------------- 
    65          苏国清    南京市合川小学
    406         刘昊斌    南京市合川小学
    444         庞春云    南京市广盛小学
    478         方富贵    南京市广盛小学
    655         张红艳    南京市汉衡小学
    921         邹忠臣    南京市汉衡小学
    935         吴运新    南京市国联小学
    965         赵刚     南京市国联小学
    290608      丛志波    南京市方正小学(所影响的行数为 9 行)*/
      

  7.   

    按以下步骤做,应该可以实现你想要的结果:按学校及ID用进行排序,插入临时表
    select *  into #temp from  原表 order by 学校,ID然后根据临时表取每个学校的第一个ID(第一次取数)
    select *   from #temp where ID in(select min(ID) from  #temp group by 学校  )除去第一次取数的ID再插入表
    select  * into #temp2  from #temp1 where ID not in(select ID from #temp1 )然后合并就是你想要的前两名的老师了
    select *  from #temp1 where id in(select min(ID) from  #temp1 group by 学校  ) --第一次取数时的老师,
    union all
    select *  from #temp2 where id in(select min(ID) from  #temp2 group by 学校 ) order by 学校---除了第一次被取的老师外,这里是第二次取的第一个老师drop table #temp
    drop table #temp1
    drop table #temp2
    这样应该可以得到你想要的结果,而且可以通用,不管有多少学校或老师,应该都可以使用
      

  8.   

    SELECT *,(SELECT COUNT(*) FROM TB WHERE 学校=T.学校 AND ID<=T.ID) AS NUM INTO # FROM TB TSELECT ID号, 姓名, 学校  FROM # WHERE NUM<=2 ORDER BY ID号