ID号 姓名 学校65 苏国清 南京市合川小学
406 刘昊斌 南京市合川小学
427 高峰 南京市合川小学444 庞春云 南京市广盛小学
478 方富贵 南京市广盛小学
480 刘铭 南京市广盛小学
565 杨林 南京市广盛小学655 张红艳 南京市汉衡小学
921 邹忠臣 南京市汉衡小学935 吴运新 南京市国联小学
965 赵刚 南京市国联小学
999 王志宏 南京市国联小学
1099 王军 南京市国联小学
2559 王宇 南京市国联小学290608 丛志波 南京市方正小学293546 朱东兴 南京市合川小学
406 刘昊斌 南京市合川小学
427 高峰 南京市合川小学444 庞春云 南京市广盛小学
478 方富贵 南京市广盛小学
480 刘铭 南京市广盛小学
565 杨林 南京市广盛小学655 张红艳 南京市汉衡小学
921 邹忠臣 南京市汉衡小学935 吴运新 南京市国联小学
965 赵刚 南京市国联小学
999 王志宏 南京市国联小学
1099 王军 南京市国联小学
2559 王宇 南京市国联小学290608 丛志波 南京市方正小学293546 朱东兴 南京市合川小学
解决方案 »
- drop table @backtable表名能否用变量实现,急
- 使用触发器更新一列时,如何更新该表中另外的列?
- 请教SQL查询问题,请各位帮忙
- 谁能帮我详细解释下这句话吗?
- 邹建大侠:部门组织结构数据在一张表里,如何导出来xml
- 如何使用select语句,使关联的两个表的其中一个表的空记录也能显示出来?
- 如何用ASP建立两个数据库中的表的关联
- 怎样才能学好C++?(新手请教学C++的方法!)
- 紧急求助....在这种情况下,几个程序对一个表进行操作,会不会出现冲突。
- 我的sqlserver库中的text型的数据导不到ACCSESS2000里,为什么?
- SQL 存储过程
- 如何去掉小数点后面的0?
---------------------------------
-- 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 行受影响)
*/
select *
from # k
where id in (select top 2 ID from # where k.学校=学校 order by ID )
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 丛志波 南京市方正小学
*/
select *
from tb t
where [ID号] in(
select top 2 [ID号]
from tb
where [学校]=t.[学校]
order by [ID号])
-- 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 行受影响)
*/
-- 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 行)*/
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
这样应该可以得到你想要的结果,而且可以通用,不管有多少学校或老师,应该都可以使用