表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,都是各个部门的最新时间
希望各位高手帮忙

解决方案 »

  1.   

    select * from [Table] a where not exists(select 1 from [Table] where a2=a.a2 where a3>a.a3)
      

  2.   

    ---try
    select * into 表B from tb T where not exists(select 1 from tb where a2部门 = T.a2部门 and a3记录时间 > T.a3记录时间 )
      

  3.   


    --tryselect * into 表B from tb T where a3记录时间 = (select max(a3记录时间) from tb where a2部门 = T.a2部门)
      

  4.   

    要是表B已经存在的话.
    --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记录时间 )字段对应
      

  5.   

    select * from [Table] a where not exists(select 1 from [Table] where a2=a.a2 and a3>a.a3)
      

  6.   


    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                     
      

  7.   

    哦,错了一点,没有求最大时间的记录,改一下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   where aaa.a3=bbb.a3                  
      

  8.   

    问一下,这个能用group by解决问题不?
    我要返回的是一个结果集,SqlDataReader
      

  9.   

    多谢结贴了,以后我有空一定多学习一下sql
      

  10.   


    我上面的方法就是要 group by 实现的啊
      

  11.   

    select aaa.a1,aaa.a2,aaa.a3 from test  aaa
    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 次。具体选择哪一个,我按照自己应用环境分别写后再回帖告诉大家