Sql 中有这样一张表A:ID       CONTENT        TIME        TYPE001      XXXX          2005-01-01    新闻
002      XXXX          2005-01-09    新闻
003      XXXX          2005-01-10    新闻
004      XXXX          2005-03-01    新闻
005      XXXX          2005-04-14    新闻
006      TTTTT         2006-02-01    供求
007      TTTTT         2006-01-01    供求
008      RRRRR         2006-01-20    供求
009      QQQQQ         2006-03-01    IT
…………………………我现在想要查询出每一个类(TYPE)中,时间(TIME)最晚的2条记录,及下面这样的结果:ID        CONTENT        TIME        TYPE005      XXXX          2005-04-14    新闻
004      XXXX          2005-03-01    新闻
006      TTTTT         2006-02-01    供求
008      RRRRR         2006-01-20    供求
………………………………请问这样的SQL语句怎么写,请指点一下,谢谢!!学习,关注!!!!

解决方案 »

  1.   


    select * from A  as t1 where (select count(1) from A where Type=t1.Type and ID!>A.ID)!>2或用时间做为判断(时间类型是datetime可用)
    select * from A as t1 where (select count(1) from A where Type=t1.Type and TIME!>A.TIME)!>2
      

  2.   

    --建立环境if object_id('a')>0 drop table a
    go
    create table a(id varchar(10),content varchar(20),time datetime,type varchar(20))
    insert into a
     select '001',     'XXXX',          '2005-01-01',    '新闻' 
    union all select '002',     'XXXX',         '2005-01-09',    '新闻' 
    union all select '003',      'XXXX',          '2005-01-10',    '新闻' 
    union all select '004',      'XXXX',          '2005-03-01',   '新闻' 
    union all select '005',      'XXXX',          '2005-04-14',   '新闻' 
    union all select '006',      'TTTTT',         '2006-02-01',    '供求' 
    union all select '007',     'TTTTT',         '2006-01-01',    '供求' 
    union all select '008',      'RRRRR',         '2006-01-20',    '供求' 
    union all select '009',      'QQQQQ',         '2006-03-01',    'IT' 
    go
     
    ----按time排序if object_id('temp') is not null   drop table temp
    select  * into temp from a order by type,time 
     
    go--执行:select  *  from temp  b   where (select count(id) from temp where id>=b.id and type=b.type )<=2 order by id
    /*
    结果:
    id                 content                     time                                       type
    ------------------------------------------------------------------------------------------
    004 XXXX 2005-03-01 00:00:00.000 新闻
    005 XXXX 2005-04-14 00:00:00.000 新闻
    007 TTTTT 2006-01-01 00:00:00.000 供求
    008 RRRRR 2006-01-20 00:00:00.000 供求
    009 QQQQQ 2006-03-01 00:00:00.000 IT
    */ 
     
      

  3.   

    select * from A t
    where TIME in 
    (
    select top 2 TIME from A where  TYPE =t.TYPE  order by TIME desc
    )
      

  4.   

    select * from A t
    where (select count(*) from A where TYPE = t.TYPE and time > t.time) < 2
      

  5.   

    为什么要加TYPE = t.TYPE 呢?
      

  6.   

    select * from A t 
    where TIME in  

    select top 2 TIME from A where  TYPE =t.TYPE  order by TIME desc 
    )
    该成这样的可以不?
    select * from A t 
    where TIME in ( 
    select top 2 TIME from A group by type order by TIME desc )
      

  7.   

    该成这样的可以不?
    select * from A t 
    where TIME in ( 
    select top 2 TIME from A group by type order by TIME desc ) 
    不行,查询中做了分组或者聚合运算,则在结果集中只能出现进行分组的字段和聚合函数建议使用
    select * from test as t where id in ( select top 2 id from test where type=t.type order by time desc )
      

  8.   

    哦。谢谢了楼上了。我知道错在那里了。
    还有这个是不是自连接。就是说表自己和自己连接的呢?
    select * from test as t where id in ( select top 2 id from test where type=t.type order by time desc )