2016-11-22 72 views
0

我有一个类似于下面所示的表格。MSSQL - 每周week_start和week_end的拆分记录

myID | some data | start_date | end_date 

1  Tom   2016-01-01  2016-05-09 
2  Mike   2015-03-01  2017-03-09 
... 

我有一个函数,当与日期,结束日期,时间间隔(例如几周)提供

返回我数据如下。 (分裂的开始和结束日期,以一周的时间间隔)

select * from my_function('2016-01-01','2016-01-12', 'ww') 

2015-12-28 00:00:00.000 | 2016-01-03 00:00:00.000 15W53 
2016-01-04 00:00:00.000 | 2016-01-10 00:00:00.000 16W1  
2016-01-11 00:00:00.000 | 2016-01-17 00:00:00.000 16W2  

我希望能够编写返回所有的值从1个表的查询,但拆分到多个行开始日期和结束日期使用该功能。

myID | some data | Week_start_date | Week_end_date | (optional)week_num 

    1  Tom   2015-12-28   2016-01-03  15W53 
    1  Tom   2016-01-04   2016-01-10  16W1 
    1  Tom   2016-01-11   2016-01-17  16W2 
    ... 
    2  Mike   etc.... 

有人可以帮我创建这样的查询吗?

+0

我相信你能给它一个镜头,然后发布关于你碰到的任何障碍的具体问题。现在,你基本上是要求某人为你做你的工作。 – dfundako

+0

我不是要求完成querry,但至少对于一些提示......我不知道从哪里开始。我对sql还是比较陌生的,如果有人能够就我可以开始构建的一些函数或示例提供建议,那将会很棒。 –

回答

2
select myID,some_data,b.Week_start_date,b.Week_end_date,b.(optional)week_num from #a cross apply 
(select * from my_function('2016-01-01','2016-01-12', 'ww'))b 

样的数据我想

create table #a 
(
myID int, some_data varchar(50) , start_date date, end_date date) 
insert into #a values 


(1,'Tom','2016-01-01','2016-05-09'), 
(2,'Mike','2015-03-01','2017-03-09') 

这里IAM保持功能导致到一个临时表

create table #b 
(
a datetime,b datetime, c varchar(50) 
) 
insert into #b values 
('2015-12-28 00:00:00.000','2016-01-03 00:00:00.000','15W53'), 
('2016-01-04 00:00:00.000','2016-01-10 00:00:00.000','16W1 '), 
('2016-01-11 00:00:00.000','2016-01-17 00:00:00.000','16W2 ') 

select myID,some_data,b.a,b.b,b.c from #a cross apply 
(select * from #b)b 

输出这样

myID some_data a b c 
1 Tom 2015-12-28 00:00:00.000 2016-01-03 00:00:00.000 15W53 
1 Tom 2016-01-04 00:00:00.000 2016-01-10 00:00:00.000 16W1 
1 Tom 2016-01-11 00:00:00.000 2016-01-17 00:00:00.000 16W2 
2 Mike 2015-12-28 00:00:00.000 2016-01-03 00:00:00.000 15W53 
2 Mike 2016-01-04 00:00:00.000 2016-01-10 00:00:00.000 16W1 
2 Mike 2016-01-11 00:00:00.000 2016-01-17 00:00:00.000 16W2 
+0

非常感谢,我将能够基于此建立。谢谢 ! –

0

根据您目前的结果和预期的结果,唯一的区别,我看到的是myID

所以你需要以包围着您的查询这样的..

;with cte 
as 
(
select * from my_function('2016-01-01','2016-01-12', 'ww') 
) 
select dense_rank() over (order by somedata) as col, 
* from cte 

密集排名为分配相同的值在同一个分区和assigs连续值一个分区,不同等级

在这里寻找更多的信息:
https://stackoverflow.com/a/7747342/2975396