将此语句视为虚拟数据:
CREATE TABLE MyTable
(
id int not null,
startDate date not null,
endDate date not null,
val int not null
)
insert into MyTable
values
(10,'20171106','20171112',7),
(10,'20171106','20171112',6),
(10,'20171106','20171112',5),
(10,'20171106','20171112',0),
(10,'20171106','20171112',2)
使用recursive CTE 选择每个元组作为开始日期并递增该日期直到它到达结束日期,如下所示:
;WITH rc AS (
SELECT id, startDate, endDate, val
, startDate AS temp_date
FROM MyTable
UNION ALL
SELECT id, startDate, endDate, val
, DATEADD(DAY,1,temp_date)
FROM rc
WHERE DATEADD(DAY,1,temp_date) <= enddate
)
SELECT *
FROM rc
您应该知道,SQL-Server 中的递归在处理较大数据时代价高昂且速度较慢。还记得提示最大递归循环量,因为默认值为 100。示例:
OPTION (MAXRECURSION 0)
0 表示无限递归,有无限运行的风险。
正如我所读到的,您正在使用数据仓库,因此它应该具有时间或日期维度。在这种情况下,一个简单的连接就可以完成这项工作:
SELECT id, startDate, endDate, val
, date_sid AS temp_date
FROM MyTable AS m
INNER JOIN DimDate AS dd
ON dd.date_sid >= startDate
AND dd.date_sid <= endDate
请考虑不要为列名使用保留键(如开始、结束或值)