前些天在CSDN看到有人发帖求助,题目是:
某个数据库表中每个人对应许多条记录,每条记录对应一个时间,她想找到用一条语句找到最早的时间和最近的时间两个记录(在规定时间段内),如下所示
name mdate cj
小芳 2005-8-2 58
小芳 2006-3-1 58
小芳 2007-3-12 60
小芳 2007-8-10 60
小芳 2008-2-22 80
小芳 2009-3-6 75
小芳 2009-11-16 89
娟娟 2004-3-6 60
娟娟 2005-2-1 88
娟娟 2008-12-20 90
要的结果就是要找到小芳在07年4月1日至09年6月时间段内最早和最近的两条记录,并且把它融合成一条新记录,得到的结果就为
name mdate1 cj1 mdate2 cj2
小芳 2007-8-10 60 2009-3-6 75
name mdate cj
小芳 2005-8-2 58
小芳 2006-3-1 58
小芳 2007-3-12 60
小芳 2007-8-10 60
小芳 2008-2-22 80
小芳 2009-3-6 75
小芳 2009-11-16 89
娟娟 2004-3-6 60
娟娟 2005-2-1 88
娟娟 2008-12-20 90
要的结果就是要找到小芳在07年4月1日至09年6月时间段内最早和最近的两条记录,并且把它融合成一条新记录,得到的结果就为
name mdate1 cj1 mdate2 cj2
小芳 2007-8-10 60 2009-3-6 75
我没做,不过看到跟帖的人回答的很好,所以摘抄一下,以便学习:
1.
select
a.name,convert(varchar(10),a.mdate,120) as mdate1,a.cj as cj1,convert(varchar(10),b.mdate,120) as mdate2,b.cj as cj2
from
(select * from [tb] t where mdate=(select min(mdate) from tb where name=t.name))a
join
(select * from [tb] t where mdate=(select max(mdate) from tb where name=t.name))b
on
a.name=b.name
select
a.name,convert(varchar(10),a.mdate,120) as mdate1,a.cj as cj1,convert(varchar(10),b.mdate,120) as mdate2,b.cj as cj2
from
(select * from [tb] t where mdate=(select min(mdate) from tb where name=t.name))a
join
(select * from [tb] t where mdate=(select max(mdate) from tb where name=t.name))b
on
a.name=b.name
2.select name,mdate1=min(mdate),cj1=(select top 1 cj from @tb where name=t.name and mdate between '2007-04-01' and '2009-07-01' order by mdate asc) ,
mdate2=max(mdate),cj2=(select top 1 cj from @tb where name=t.name and mdate between '2007-04-01' and '2009-07-01' order by mdate desc)
from @tb t
where mdate between '2007-04-01' and '2009-07-01'
group by name
mdate2=max(mdate),cj2=(select top 1 cj from @tb where name=t.name and mdate between '2007-04-01' and '2009-07-01' order by mdate desc)
from @tb t
where mdate between '2007-04-01' and '2009-07-01'
group by name
转载于:https://blog.51cto.com/shouwang/268758