sql - 在雪花视图中将日期范围拆分为新记录
问题描述
我有一个包含开始日期和结束日期的表,我需要将记录拆分为按天计算,这需要进入视图。
| PersonID | CompanyID | Start_DT | End_DT |
|-----------|--------------|-------------|-----------|
| A12 | abc | 05-01-2020 | 05-03-2020|
| B23 | def | 06-08-2020 | 06-14-2020|
| PersonID | CompanyID | New_DT |
|-----------|--------------|-------------|
| A12 | abc | 05-01-2020 | ==> A12 Start Date is 05-01-2020 and End Date is 05-03-2020. So there are 3 records generated in New_DT
| A12 | abc | 05-02-2020 |
| A12 | abc | 05-03-2020 |
| B23 | def | 06-08-2020 |
| B23 | def | 06-09-2020 |
| B23 | def | 06-10-2020 |
| B23 | def | 06-11-2020 |
| B23 | def | 06-12-2020 |
| B23 | def | 06-13-2020 |
| B23 | def | 06-14-2020 |
如何在 View 中实现这一点?
解决方案
您可以使用递归 CTE:
with cte as (
select PersonID, CompanyID, Start_DT as new_dt, End_DT
from t
union all
select PersonID, CompanyID, dateadd(day, 1, new_dt), End_DT
from cte
where new_dt < end_dt
)
select PersonID, CompanyID, new_dt
from cte
option (maxrecursion 0);
如果您的期限超过 100 天,则需要添加option (maxrecursion 0)
.
这是一个 db<>fiddle。
推荐阅读
- c# - 从 Azure 私有存储容器中获取 Blob
- xamarin.forms - 无法在 iOS 13 中安装设备代理
- javascript - 如何改进对大量 React 元素的过滤?
- java - 如何将新变量(来自以前的活动)添加到列表中以显示在 android studio 的 listview 上?
- puppet - Puppet - 未定义的局部变量
- android - 您可以使用自定义注释处理器读取/修改/替换 AndroidManifest.xml 文件吗
- android - 如何仅在带有 React Native 的 Android 上使用 CodePush
- android - 在移动设备上测量具有可访问性要求的用户数量
- json - 如何在groovy中获取返回json正文响应的Id属性
- c# - 使用 C# 对动态分页值进行 Web 抓取