再开个帖子问问

emilchan7k 2013-01-18 03:04:40
http://bbs.csdn.net/topics/390350488
原帖在这里,解决了那边登记一下也给分,那边我弄错了

id name masterId createdate
1 aaa 55 2012-1-1
2 aaa 55 2012-5-1
3 bbb 61 2012-7-1

不好意思,我弄错了,现在不是要找最大的创建时间,现在是要找:
1,如果只有一条记录,就和当前时间比,是否超了3个月
2.如果有多条记录,是否最近的两条间隔超了3个月

由此,上面记录应该是id的2,3被选出来,或者直接返回55,56的masterid
...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
szm341 2013-01-19
  • 打赏
  • 举报
回复

create table #t([id] int,[name] varchar(3),[masterId] int,[createdate] date)
insert #t
select 1,'aaa',55,'2012-1-1' union all
select 2,'aaa',55,'2012-5-1' union all
select 3,'bbb',61,'2012-7-1'

;with cte as
(
select *,ROW_NUMBER() OVER(partition by masterId order by createdate desc) as rn from #t
)select * from 
(select * from cte where rn=1) a left join
(select * from cte where rn=2) b on a.masterId=b.masterId
where abs(DATEDIFF(mm,isnull(b.createdate,convert(date,GETDATE())),a.createdate))>=3

/*
id          name masterId    createdate rn
----------- ---- ----------- ---------- --------------------
2           aaa  55          2012-05-01 1
3           bbb  61          2012-07-01 1

*/
美到心痛 2013-01-19
  • 打赏
  • 举报
回复

use Tempdb
go
declare @T table(id int,name varchar(3),masterid varchar(2),createdate varchar(10))

insert @T select  1 ,'aaa',55 ,'2012-1-1'
union all select  2 ,'aaa' ,55,'2012-5-1'
union all select  3 ,'bbb' ,61, '2012-7-1'
union all select  4 ,'aaa' ,55, '2011-7-1'

select id,name,masterid
from ( select *,
(select max(createdate) from @T as b where b.name=a.name and b.createdate<a.createdate) as priordate
from @T as a
where not exists(select 1 from @T as c where c.name=a.name and c.createdate>a.createdate ) ) as d
where abs(datediff(m,createdate,isnull(priordate,getdate())))>3

/*
2 aaa	55
3 bbb	61	
*/
emilchan7k 2013-01-18
  • 打赏
  • 举报
回复
啊?我没说清楚啊? id name masterId createdate 1 aaa 55 2012-1-1 2 aaa 55 2012-5-1 3 bbb 61 2012-7-1 不好意思,我弄错了,现在不是要找最大的创建时间,现在是要找: 1,如果只有一条记录,就和当前时间比,是否超了3个月 2.如果有多条记录,是否最近的两条间隔超了3个月 关于第二点,aaa有2条,也可能有多条,现在要找出aaa最近的两条,比较createdate,比如现在的aaa,createdate间隔超过3个月了,如果没超过3个月,就把id=2,或者masterid=55选出来即可,我说明白没?
發糞塗牆 2013-01-18
  • 打赏
  • 举报
回复
你自己都不知道想要啥别人怎么写啊
emilchan7k 2013-01-18
  • 打赏
  • 举报
回复
我就是想不到啊,现在想分开来写,两个选出来然后union,但判断连续两个日期是否间隔超期处理不来
發糞塗牆 2013-01-18
  • 打赏
  • 举报
回复
如果aaa那个数据有2条以上怎么处理?对于有一条的数据可以这样写:
SELECT a.*
FROM huang a INNER JOIN (
SELECT NAME 
FROM huang 
GROUP BY NAME 
HAVING COUNT(name)=1)b ON a.NAME=b.NAME
WHERE DATEDIFF(mm,CONVERT(DATE,createdate),CONVERT(DATE,GETDATE()))>=3

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧