我的数据格式如下:
+------------+-----------+-----------+
| Case_Number|Start_Date |End_Date |
+------------+-----------+-----------+
|A1 | 12/1/2017 | 12/15/2017|
|A2 | 12/12/2017| 12/28/2017|
我希望使用第二个表中的值将开始和结束数据转换为列值,该表将值向下舍入到一周的开头。例如,12/1/2017
将向下舍入为11/27/2017
,对应于星期一。做这个转换,我希望以下列格式获取数据:
+----------------+-----------+
| Week Start Date|Case Number|
+----------------+-----------+
|11/27/2017 | A1 |
|12/4/2017 | A1 |
|12/11/2017 | A2 |
|12/18/2017 | A2 |
我希望每周的第一个星期一显示案件已经生效。如果案例在任何给定的一周内关闭,我们不希望在生成的第二个表中显示该周。
答案 0 :(得分:1)
如果从星期一开始的每周的帮助表也有该日期的另一列加上7天,那将是很好的,但如果没有,这应该有效:
select datatable.case_number, helper.week_date
from helper
left join datatable on datatable.end_date >= helper.week_start
and datatable.start_date < dateadd('d',7,helper.week_start)
请注意,这个逻辑来自于可能看起来“回到前面”的日期关系
W1 w2
s-E | | ignore
s--|--------|-E
s-|---E |
s----E |
| s---E |
| s----E
| s--|-E
| | s-E ignore
s < w2
E >= W1
该“图片”的第一行和最后一行在W1 to w2
期间没有任何参与,因此会被忽略。所有其他行确实在W1 to w2
期间有一些参与,所以我们想要满足所有这些条件而不是其他条件。我们想要的所有位置s
都是< w2
,我们想要的所有位置E
都是> W1
,但是对于我们要忽略的所有行,其中一个条件是不真实的。因此,对于我们想要的所有行:s < w2 and E > W1