比如例子是这样
    ID            DATE             STATE
    2             2009-09-17          1
    2             2009-09-19          2
    2             2009-09-07          3
    1             2009-09-01          2
    1             2009-09-27          1
我想按时间选出ID最新状态,结果为    2             2009-09-19          2
    1             2009-09-27          1该怎么构造语句呢

解决方案 »

  1.   

    SELECT * FROM TB T WHERE DATE=(SELECT MAX(DATE) FROM TB WHERE ID=T.ID)
      

  2.   

    select *
    from tb a
    where not exists (select 1 from tb b where a.id=b.id and a.id<b.id)
      

  3.   

    select * from t a inner join 
    (select id,max([date]) as maxdate from t) b
    on a.id=b.id and a.[date]=b.maxdate 
      

  4.   

    select t1.* from (select * from tb order by date desc) as t1 group by t1.id
      

  5.   

    帖子加分了,我想知道详细的构建过程(我是菜鸟。)
       TABLE 名为  SVR
        ID            DATE            STATE 
        2            2009-09-17          1 
        2            2009-09-19          2 
        2            2009-09-07          3 
        1            2009-09-01          2 
        1            2009-09-27          1 
    想得到的结果是
         2            2009-09-19          2 
        1            2009-09-27          1 
    就是按时间查出每个ID的最新状态分不够的话继续加
      

  6.   

    group by 会从一组id相同的记录中按默认的排序规则取出第一条,有可能是date最早的一条,所以要先把记录集按date排序以后,然后再group by, 就可以了
      

  7.   

    CREATE TABLE #DBTemp(Id INT, DATE DATETIME, STATE INT)INSERT INTO #DBTemp
    SELECT 2,'2009-09-17',1 UNION ALL 
    SELECT 2,'2009-09-19',2 UNION ALL 
    SELECT 2,'2009-09-07',3 UNION ALL 
    SELECT 1,'2009-09-01',2 UNION ALL 
    SELECT 1,'2009-09-27',1 
    SELECT * FROM #DBTemp T WHERE DATE=(SELECT MAX(DATE) FROM #DBTemp WHERE ID=T.ID)DROP TABLE #DBTemp