我有这样的记录:
start, end , total
830 , 1300, 5
1400, 1430, 2
我想扩展到:
instance , total
830 , 5
831 , 5
832 , 5
...
1299 , 5
1300 , 5
1400 , 2
1401 , 2
...
1429 , 2
1430 , 2
如何在MSSQL 2005中使用SQL做到这一点?
编辑:谢谢大家,很棒的答案。有一些工作。我只是忘了说虽然开始/结束真的是一个存储为int的时间,所以0830到1300应该上升到0859然后0900.我不能指望你们在同一个问题中回答这个问题,我会工作周围。再次感谢答案 0 :(得分:1)
这应该可以解决问题:
create table input (start int, [end] int, total int)
insert input values (830, 1300, 5)
insert input values (1400, 1430, 2)
declare @output table (instance int, start int, [end] int, total int)
insert @output select start, start, [end], total from input
while @@rowcount > 0
insert @output
select
max(instance) + 1,
start,
[end],
total
from @output
group by
start,
[end],
total
having max(instance) < [end]
select instance, total from @output order by instance
这将输出与您在问题中描述的相同(未截断)结果。
可能有一些奇特的CTE方法,但我不认为这可行,因为你需要无限量的递归。
答案 1 :(得分:1)
使用CTE:
with number_cte(n) as
(select n from (select 0 n) m union all select n+1 n
from number_cte where n< 2400)
select start+n instance, total
from
datatable
join number_cte on start+n between start and [end]
where start+n - 100*floor((start+n)/100) between 0 and 59
order by 1
option (maxrecursion 2401)
(如果需要大于2400的范围,则适当增加n <...和maxrecursion数。)
编辑以防止包含无效的实例(即结束在60和99之间的时间值)。
答案 2 :(得分:0)
假设您的END值有一个有限的最大值,您可以使用数字表(更改2000我曾经是您的最大END值):
declare @Test table (
start int,
[end] int,
total int
)
insert into @Test
(start, [end], total)
select 830, 1300, 5
union
select 1400, 1430, 2
;WITH Nbrs ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM Nbrs WHERE n < 2000
)
select n.n, t.total
from @Test t
cross join Nbrs n
where n.n between t.start and t.[end]
option (MAXRECURSION 2000)