求一个SQL语句,请指点一下!!!!
Sql 中有这样一张表A:
ID CONTENT TIME TYPE
001 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 TYPE
005 XXXX 2005-04-14 新闻
004 XXXX 2005-03-01 新闻
006 TTTTT 2006-02-01 供求
008 RRRRR 2006-01-20 供求
………………………………
请问这样的SQL语句怎么写,请指点一下,谢谢!!
学习,关注!!!!
------解决方案--------------------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
------解决方案----------------------建立环境
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
*/
------解决方案--------------------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 (select count(*) from A where TYPE = t.TYPE and time > t.time) < 2
------解决方案--------------------该成这样的可以不?
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 )
------解决方案--------------------哦。谢谢了楼上了。我知道错在那里了。
还有这个是不是自连接。就是说表自己和自己连接的呢?