T1: id  状态  时间
     1    a    t1
    1    b    t2
    2    b    t3
    2    a    t4T2:id   名称     类型
     1   name1   type1
    2   name2   type2表T1和表T2的id关联,其中T1中的时间各不相同,我想得到T1中各类状态组里时间最大的那条记录的所有信息,结果为:
(以下假设:t2>t1 t4>t3)
    id   状态   时间   名称      类型
     1    b     t2    name1  type1
    2    a     t4    name2  type2

解决方案 »

  1.   

    select a.id,a.状态,a.时间,b.名称,b.类型
    from t1 a
    inner join t2 b on a.id=b.id
    where not exists(select 1 from t1 where 状态=a.状态 and 时间>a.时间)
      

  2.   

    对不起,我的问题可能没有讲清楚,实际上表T1中的同一个id可能有很多记录,我想对于时间可能需要MAX函数来取得其最大值,此时该怎么做?
      

  3.   

    select a.id,a.状态,a.时间,b.名称,b.类型 
    from t1 a 
    left join t2 b on a.id=b.id 
    where not exists(select 1 from t1 where 状态=a.状态 and 时间>a.时间)
      

  4.   

    而且,T1中的id并不知道具体数值,正是需要取出来的查看的
    在T1中,有很多不同的id,而同一个id有很多不同的状态,这些状态又对应不同的时间,我的问题主要要取到T1里同一个id且同一个状态那一类中的具有最大时间的那条记录。
      

  5.   

    ---取多条记录..也就是说有时间一样的都是最大值!
    select a.id,a.状态,a.时间,b.名称,b.类型 
    from t1 a 
    left join t2 b on a.id=b.id 
    where a.时间 in (select top 1 时间 from t1 where a.id=id and a.状态=状态 order by 时间)
      

  6.   

    T1里同一个id且同一个状态那一类中的具有最大时间的那条记录。 
    如果最大时间都是20:00 有两条记录..是取一条呢还是两条?
      

  7.   

    --try
    select a.id,a.状态,a.时间,b.名称,b.类型 
    from t1 a 
    left join t2 b on a.id=b.id 
    where  a.id+a.状态 in (select top 1 id+状态 from t1 where a.id=id and a.状态=状态 order by 时间) 
      

  8.   

    SELECT T1.id, MAX(T1.时间), T2.名称, T2.类型
    FROM T1 INNER JOIN
          T2 ON T1.id = T2.id
    GROUP BY T1.id, T2.名称, T2.类型我用以上方式获得了一部分结果,但是得不到“T1.状态”,因为一旦在select和group by中加入“T1.状态”,结果就把所有的记录取出来了?!
      

  9.   


    就差状态了,得到就一切over,唉帮帮我,大侠
      

  10.   

    declare @T1 table(id int ,Stat nvarchar(20),DateState datetime)
    insert into @T1 select 1,'a','2008-08-19 00:00:00' 
    insert into @T1 select 2,'b','2008-08-21 00:00:00' 
    insert into @T1 select 3,'b','2008-08-21 00:00:00'
    insert into @T1 select 4,'a','2008-08-22 00:00:00' 
    insert into @T1 select 4,'c','2008-08-22 00:00:00' declare @T2 table(id int,T_name nvarchar(20),model nvarchar(20))
    insert into @T2 select 1,'name1','type1'
    insert into @T2 select 2,'name2','type2'declare @T3 table(realid int identity(1,1),id int ,Stat nvarchar(20),DateState datetime,T_name nvarchar(20),model nvarchar(20))insert into @T3
    select a.id,a.Stat,a.DateState,b.T_name,b.model
    from @T1 a left join @T2 b on a.id=b.idselect *
    from @T3
    where realid in(
    select  max(realid) as realid
    from @T3
    group by Stat)假如例子不对的话,可以看看思路,呵呵
      

  11.   

    用这个试试,不只能否帮到你select T1.id,T1.状态,T1.时间,T2.名称,T2.类型 
    from T1 inner join T2 on(T1.id=T2.id)
    where T1.时间=(select max(时间) from T1)
    group by T1.id
      

  12.   


    您和我的思路很接近。但是,我被这样一个问题所困扰:并非始终能够取到同一个id的最大时间的那一条记录,有时取到的却是该id的两条记录!以下是我的sql真实语句(事实上,这里有三个表通过id关联在一起的——Manuscript_Accept、Manusrcipt_upload和History):SELECT Manuscript_Accept.id, Manuscript_Accept.对方案号, Manuscript_Accept.我方案号, 
          Manusrcipt_upload.语种, Manusrcipt_upload.代理名称, Manusrcipt_upload.稿件名称, 
          Manusrcipt_upload.字数, Manusrcipt_upload.附图页数, Manusrcipt_upload.申请日, 
          Manusrcipt_upload.提交时间, Manusrcipt_upload.用户名, 
          Manusrcipt_upload.稿件路径, History.稿件状态, History.时间
    FROM History INNER JOIN
          Manusrcipt_upload ON History.id = Manusrcipt_upload.id INNER JOIN
          Manuscript_Accept ON Manusrcipt_upload.id = Manuscript_Accept.id
    WHERE (History.时间 IN
              (SELECT MAX(时间) AS Expr1
             FROM History AS History_1
             GROUP BY id))
    ORDER BY Manusrcipt_upload.提交时间 DESC
    此时,我的问题归结为:一旦在group by里指定了“状态”列之后,MAX函数就失效了,取到的却是所有的记录?
      

  13.   


    您的方法出现如下问题:“选择列表中的列‘状态’无效,因为该列没有包含在聚合函数或group by子句中”。但是,如果将“状态”、“时间”、“名称”和“类型”放进group by之后,取到的将是所有记录里最大时间的那一条,而不是不同一个id的那些记录中具有最大时间值的那些记录。感觉只有一步之遥了!期待中
      

  14.   

    有办法了,自表连接会吗?where a.id!=b.id 多加一个判断语句
      

  15.   

    感谢大家!问题搞定了,是时间问题,我追加了一个自动增量的key索引,然后以该索引为max即可。谢谢jason_gong , guoli0813!