首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

[100分]求依据日期分组(续)

2013-07-01 
[100分]求根据日期分组(续)http://bbs.csdn.net/topics/390499367问题跟着上个帖子.先谢谢lzw_0736和dengh

[100分]求根据日期分组(续)
http://bbs.csdn.net/topics/390499367
问题跟着上个帖子.
先谢谢lzw_0736和denghui_li帮我解决上面这个难题。
现在是
根据按照 同一个标记,从最初的开始时间算起,
3个月以内同一个标记的算一组,下个日期依然按着个要求算,并标记出现次数的需求。
把数据
[sign] [date]
1 2012-01-01
1 2012-02-06

1 2012-05-03
1 2012-06-11

1 2012-09-01

2 2012-02-03
2 2012-04-19
2 2012-04-23

分组为:
[sign] [date] [n]
1 2012-01-01 2
1 2012-05-03 2
1 2012-09-01 1
2 2012-02-03 3


现在又添加了新的需求,需要根据分组的结果反查询到对应的数据。
我想来想去,只发现一个方法:
就把原有的数据变成
[sign] [date]   [s_sign] [s_date] [s_n]
1 2012-01-01 1 2012-01-01 2
1 2012-02-06 1 2012-01-01 2

1 2012-05-03 1 2012-05-03 2
1 2012-06-11 1 2012-05-03 2

1 2012-09-01 1 2012-09-01 1

2 2012-02-03 2 2012-02-03 3
2 2012-04-19 2 2012-02-03 3
2 2012-04-23 2 2012-02-03 3

查询的统计结果的时候 Select distinct  [s_sign] [s_date] [s_n]
详细的时候就查询 Select [sign] [date]  from t1 where [s_sign], [s_date], [s_n]

但是我现在就是无法实现上面的格式,实验几个小时了[100分]求依据日期分组(续)
求救啊!!谢谢!
[解决办法]


with t ([sign],[date]) as
 (
 select 1,'2012-01-01'
 union all
 select 1,'2012-02-06'
 union all
 select 1,'2012-05-03'
 union all
 select 1,'2012-06-11'
 union all
 select 1,'2012-09-01'
 union all
 select 2,'2012-02-03'
 union all
 select 2,'2012-04-19'
 union all
 select 2,'2012-04-23'
 )
 ,tGroup as
 (
 select [sign],min([date]) as [date] 
 from t
 group by [sign]
 )
select a.*,10000*a.[sign]+ datediff(DAY,b.[date],a.[date])/90   gn
from t a
join tGroup b
on a.[sign]=b.[sign] 


order by a.[sign],a.[date]



gn 即为分组号
[解决办法]
with a1 ([sign],[date]) as--明細
(
select 1,'2012-01-01' union all
select 1,'2012-02-06' union all
select 1,'2012-05-03' union all
select 1,'2012-06-11' union all
select 1,'2012-09-01' union all
select 2,'2012-02-03' union all
select 2,'2012-04-19' union all
select 2,'2012-04-23'
)
,a2 ([s_sign],[s_date],[s_n]) as
(
select 1,'2012-01-01',2 union all
select 1,'2012-05-03',2 union all
select 1,'2012-09-01',1 union all
select 2,'2012-02-03',3
)
select  *
from a1 a
inner join a2 b on a.[sign]=b.[s_sign] and DATEDIFF(day,b.[s_date],a.[date]) between 0 and 90
order by 1,2

[解决办法]

with tb([sign],[date])as(
select 1,'2012-01-01' union
select 1,'2012-02-06' union
select 1,'2012-05-03' union
select 1,'2012-06-11' union
select 1,'2012-09-01' union
select 2,'2012-02-03' union
select 2,'2012-04-19' union
select 2,'2012-04-23'),
tc([sign],[date],[n])as(
select 1,'2012-01-01',2 union
select 1,'2012-05-03',2 union
select 1,'2012-09-01',1 union
select 2,'2012-02-03',3)
select * from tb left join tc on datediff(month,tc.date,tb.date)between 0 and 3 and tb.sign=tc.sign

是这样?

热点排行