从具有汇总数据的源 table 在 SQL table 中创建多行
Creating multiple rows in a SQL table from a source table that has summarised data
我有一个 table t_times
看起来像这样
start_time
End_time
Number_of_slots
Slot_Duration
08:00
09:00
6
10
09:00
09:30
1
30
我需要使用 t_times
中的值创建一个 table 来创建 t_slots
start_time
End_time
Duration
08:00
08:10
10
08:10
08:20
10
08:20
08:30
10
08:30
08:40
10
08:40
08:50
10
08:50
09:00
10
09:00
09:30
30
本质上,对于 number_of_slots 字段中指定的每个值,我需要:
- 在目标中创建一个新行 table
- 使用持续时间添加相应的时间段(开始和结束),同时考虑 slot_duration 字段的值。 IE。对于 6 的值,我需要添加 6 行,每行以 10 分钟为增量,每行使用 start_time 作为起始值
我可以用光标来完成,但这似乎是一种非常迂回的方式。有人可以给我指明 SQL 方向吗?谢谢!!!
所以这里的主要思想是使用数字 table 的经典方法。将这样的 table 作为持久性文件是很常见的,因此不需要在 运行 时间生成它。它是您的分析工具的常用工具。
其次是将它与右侧谓词上的源连接起来。
use tempdb
go
drop table if exists src
go
create table src (
start_time time
,End_time time
,Number_of_slots int
,Slot_Duration int
)
go
insert into src values
('08:00', '09:00', 6, 10)
,('09:00', '09:30', 1, 30)
go
;with nums as (
select row_number() over(order by (select null)) as n
from sys.all_columns
)
select start_time, dateadd(MINUTE, n*Slot_Duration, start_time) as end_time
, Slot_Duration as Duration
from src
join nums on src.Number_of_slots >= nums.n
order by start_time, end_time
我有一个 table t_times
看起来像这样
start_time | End_time | Number_of_slots | Slot_Duration |
---|---|---|---|
08:00 | 09:00 | 6 | 10 |
09:00 | 09:30 | 1 | 30 |
我需要使用 t_times
中的值创建一个 table 来创建 t_slots
start_time | End_time | Duration |
---|---|---|
08:00 | 08:10 | 10 |
08:10 | 08:20 | 10 |
08:20 | 08:30 | 10 |
08:30 | 08:40 | 10 |
08:40 | 08:50 | 10 |
08:50 | 09:00 | 10 |
09:00 | 09:30 | 30 |
本质上,对于 number_of_slots 字段中指定的每个值,我需要:
- 在目标中创建一个新行 table
- 使用持续时间添加相应的时间段(开始和结束),同时考虑 slot_duration 字段的值。 IE。对于 6 的值,我需要添加 6 行,每行以 10 分钟为增量,每行使用 start_time 作为起始值
我可以用光标来完成,但这似乎是一种非常迂回的方式。有人可以给我指明 SQL 方向吗?谢谢!!!
所以这里的主要思想是使用数字 table 的经典方法。将这样的 table 作为持久性文件是很常见的,因此不需要在 运行 时间生成它。它是您的分析工具的常用工具。 其次是将它与右侧谓词上的源连接起来。
use tempdb
go
drop table if exists src
go
create table src (
start_time time
,End_time time
,Number_of_slots int
,Slot_Duration int
)
go
insert into src values
('08:00', '09:00', 6, 10)
,('09:00', '09:30', 1, 30)
go
;with nums as (
select row_number() over(order by (select null)) as n
from sys.all_columns
)
select start_time, dateadd(MINUTE, n*Slot_Duration, start_time) as end_time
, Slot_Duration as Duration
from src
join nums on src.Number_of_slots >= nums.n
order by start_time, end_time