大家帮忙思考一个SQL逻辑,连续工作日的发生交易问题
假如我有一个这样的表:
id 发生日期 发生次数
-------------------------
id fsrq fscs
01 20070901 1
02 20070901 1
03 20070901 1
01 20070902 1
02 20070902 3
01 20070903 1
01 20070904 1
02 20070904 1
03 20070904 1
------------------------
现在,我想将fscs> =3,或者每天发生持续3天以上的帐号挑出来,比如说,01和02,
该怎么写这个SQL语句??
------解决方案----------------------建立测试环境
create table tb(id varchar(9),fsrq smalldatetime,fscs int)
insert tb(id,fsrq,fscs)
select '01 ', '20070901 ', '1 ' union all
select '02 ', '20070901 ', '1 ' union all
select '03 ', '20070901 ', '1 ' union all
select '01 ', '20070902 ', '1 ' union all
select '02 ', '20070902 ', '3 ' union all
select '01 ', '20070903 ', '1 ' union all
select '01 ', '20070904 ', '1 ' union all
select '02 ', '20070904 ', '1 ' union all
select '03 ', '20070904 ', '1 '
go
--执行测试语句
select id,min(fsrq) as 开始时间,max(fsrq) as 结束时间,sum(fscs) as fscs
from(
select a.id,a.fsrq,a.fscs,count(1) as ii
from tb a
join tb b on b.id=a.id and b.fsrq <=a.fsrq
group by a.id,a.fsrq,a.fscs
)c
group by id, DATEADD(day,-c.ii,fsrq)
having sum(fscs) > = 3
go
--删除测试环境
drop table tb
go
/*--测试结果
id 开始时间 结束时间 fscs
--------- ---------------- --------------------- -----------
01 2007-09-01 00:00:00 2007-09-04 00:00:00 4
02 2007-09-01 00:00:00 2007-09-02 00:00:00 4
*/
------解决方案--------------------select distinct id
from tablename a
where fscs> =3
or (
exists (select 1 from tablename b
where b.id=a.id
and b.fsrq=dateadd(day,-1,a.fsrq)
)
and exists (select 1 from tablename b
where b.id=a.id
and b.fsrq=dateadd(day,1,a.fsrq)
)
)
------解决方案--------------------Haiwer(海阔天空) 大哥的想法很巧妙啊,赞一下
------解决方案--------------------create table tb(id varchar(8), fsrq datetime, fscs int)
go
insert tb select '01 ', '20070901 ', 1
union all select '02 ', '20070901 ', 1
union all select '03 ', '20070901 ', 1
union all select '01 ', '20070902 ', 1
union all select '02 ', '20070902 ', 3
union all select '01 ', '20070903 ', 1