【问题标题】:MSSQL - split records per week_start and week_endMSSQL - 每 week_start 和 week_end 拆分记录
【发布时间】:2016-11-22 13:38:54
【问题描述】:

我有一张类似于下图的表格。

myID |  some data  |  start_date   |    end_date

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

我有一个函数,当提供 start_date、end_date、间隔(例如周)时

返回如下数据。 (将开始日期和结束日期拆分为周间隔)

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....

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

【问题讨论】:

  • 我相信您可以试一试,然后针对您遇到的任何问题发布一个具体问题。现在,您基本上是在请人为您工作。
  • 我不是要求完成查询,但至少是一些提示......我什至不知道从哪里开始。我对 sql 还是很陌生,如果有人能就一些我可以开始构建的函数或示例给我建议,那就太好了。

标签: sql-server tsql


【解决方案1】:
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')

这里我将函数结果保存到一个临时表中

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 

【讨论】:

  • 非常感谢,我将能够在此基础上进行构建。谢谢!
【解决方案2】:

根据您当前的结果和预期结果,我看到的唯一区别是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

Dense Rank 为同一个分区分配相同的值,并将顺序值分配给下一个分区,这与 Rank 不同

查看此处了解更多信息:
https://stackoverflow.com/a/7747342/2975396

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多