表A 列a1=事件内容 a2部门 a3记录时间
查账 会计 2008-5-17 19:47:29
人员调动 会计 2008-3-28 09:00:00
休假3天 会计 2008-4-30 19:00:00
人员调用 人事 2007-6-2 13:12:02
招聘 人事 2008-3-2 9:30:00
采购原材料 采购 2008-3-13 09:00:00
现在是要求: 用一个sql语句select之后获得一张表B,表B要求按照列"a2部门"获得每个部门"a3最新时间"的"a1事件内容"
举例里面有三个部分,其中会计3个事件,人事2个事件
在B表会有3个记录
分别会计1,人事1,采购1,都是各个部门的最新时间
希望各位高手帮忙
查账 会计 2008-5-17 19:47:29
人员调动 会计 2008-3-28 09:00:00
休假3天 会计 2008-4-30 19:00:00
人员调用 人事 2007-6-2 13:12:02
招聘 人事 2008-3-2 9:30:00
采购原材料 采购 2008-3-13 09:00:00
现在是要求: 用一个sql语句select之后获得一张表B,表B要求按照列"a2部门"获得每个部门"a3最新时间"的"a1事件内容"
举例里面有三个部分,其中会计3个事件,人事2个事件
在B表会有3个记录
分别会计1,人事1,采购1,都是各个部门的最新时间
希望各位高手帮忙
select * into 表B from tb T where not exists(select 1 from tb where a2部门 = T.a2部门 and a3记录时间 > T.a3记录时间 )
--tryselect * into 表B from tb T where a3记录时间 = (select max(a3记录时间) from tb where a2部门 = T.a2部门)
--try
insert into 表B(col1,col2,col3)
select * from tb T where not exists(select 1 from tb where a2部门 = T.a2部门 and a3记录时间 > T.a3记录时间 )字段对应
declare @tmp table(a1 varchar(100),a2 varchar(100),a3 datetime)
insert into @tmp (a1,a2,a3) values('查账','会计','2008-5-17 19:47:29 ')
insert into @tmp (a1,a2,a3) values('人员调动','会计','2008-3-28 09:00:00')
insert into @tmp (a1,a2,a3) values('休假3天','会计','2008-4-30 19:00:00 ')
insert into @tmp (a1,a2,a3) values('人员调用','人事','2007-6-2 13:12:02')
insert into @tmp (a1,a2,a3) values('招聘','人事','2008-3-2 9:30:00 ')
insert into @tmp (a1,a2,a3) values('采购原材料','采购','2008-3-13 09:00:00 ')--select * from @tmp
select aaa.a1,aaa.a2,aaa.a3 from @tmp aaa
inner join (select max(a3) as a3,a2 from @tmp group by a2) bbb
on aaa.a2=bbb.a2
insert into @tmp (a1,a2,a3) values('查账','会计','2008-5-17 19:47:29 ')
insert into @tmp (a1,a2,a3) values('人员调动','会计','2008-3-28 09:00:00')
insert into @tmp (a1,a2,a3) values('休假3天','会计','2008-4-30 19:00:00 ')
insert into @tmp (a1,a2,a3) values('人员调用','人事','2007-6-2 13:12:02')
insert into @tmp (a1,a2,a3) values('招聘','人事','2008-3-2 9:30:00 ')
insert into @tmp (a1,a2,a3) values('采购原材料','采购','2008-3-13 09:00:00 ')select * from @tmp
select aaa.a1,aaa.a2,aaa.a3 from @tmp aaa
inner join (select max(a3) as a3,a2 from @tmp group by a2) bbb
on aaa.a2=bbb.a2 where aaa.a3=bbb.a3
我要返回的是一个结果集,SqlDataReader
我上面的方法就是要 group by 实现的啊
inner join (select max(a3) as a3,a2 from test group by a2) bbb
on aaa.a2=bbb.a2 where aaa.a3=bbb.a3
select * from test T
where not exists(select 1 from test where a2 = T.a2 and a3 > T.a3 )
以上两种都解决了战斗,在无索引等优化下,
方法1 性能消耗68% 扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
方法2 性能消耗32% 扫描计数 2,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。具体选择哪一个,我按照自己应用环境分别写后再回帖告诉大家