回答

收藏

T-SQL脚本-时间轴的逻辑问题

技术问答 技术问答 253 人阅读 | 0 人回复 | 2023-09-14

创建两个临时表,然后加载它们…这是架构。
0 a8 ?4 A$ s0 g3 E" B7 d+ BCreate table #SH ([date] datetime,       sched_id int,       agent_id int)Create table #SD (sched_id int,       start_minute int,       length int,       exception_code int)(不幸的是,我无法改变架构和设计,两个临时表都是从平面文件中加载的。如有必要,我可以介绍并加载新的临时表。3 a+ S$ K$ E; M1 ?  r& b, ~
一点背景-#SH标题表保存了人员时间表 Start_minute,以分钟为单位- W9 t- ~: `" B. d8 r- p% V
schedule_length例如,如果开始时间和计划时间为480,则表示为8am(8am = 480th直到4分钟)pm(480分钟后,4pm5 H1 R5 W& Q6 _' t* _
= 960th分钟)。; G! m: p6 s" C: x
SD表保留标头异常。在上述示例中,此人可能有午餐例外,例外是start_minute =长度为30(12:00-12:30)。日期和agent_id是#SH我唯一感兴趣的是,#sd异常信息是我感兴趣的。
2 t5 n$ K5 @) K3 b  A$ `查询有效:
1 j3 N. n% \3 HSelect [date],#sd.start_minute,#sd.length,#sd.start_minute   #sd.length as 'end_minute',agent_idfrom #SH inner join #SD on #SD.sched_id = #sh.sched_idend_minute最终是start   length = end的计算值这种返回类似:" ^, g3 ]6 x2 F3 j; I# f
            Date     Start  length   end1 2010-11-11.600   30 6302020100-11-11 630   40  6703 2010-11-11 750   15 7654 2010-11-11800   40 8400 现在我希望我能说它已经结束并离开了……然而,存在数据输入问题。在第一行和第二行中,第一行的结束时间与第二行的开始时间对齐,因此应该合并,以便我的结果看起来像这样:
) P) k% l8 n& f+ k0 wDate     Start  length     end1 2010-11-11.600    70 6702020100-11-11 750   15 7653 2010-11-11 800    40  840任何关于如何构建这种逻辑的想法都能让我得到三行而不是四行?我正在暂时将表连接到#sd1.start  #sd1.length =#sd2.start上。- d6 j7 ^1 R. V. f" h  h
更复杂的是…上面的例子是两行需要合并。我遇到了一个记录,它有30个1分钟的连续输入记录,需要记录在单个记录中。幸运的是,它们不能重叠(你不会有两个记录占据相同的分钟),但我认为我会考虑上面join句子不会起作用。
$ o- v: \' G5 W8 [+ e                                                               
: z' [6 h" T& j2 }# o+ H    解决方案:                                                                ! I/ s  k" p% b- E5 w
                                                                无需CTE,您所需要的只是一个辅助表格。一次创建,如下所示:" ^+ {4 w9 f7 T* m
Create Table DayMinute(Minute Integer)Declare @M IntegerSet @M = 1While (@M 然后,你只需要一点技巧:, {7 V  c4 J5 w+ Z' {  |
Select   DM.Minute, SD.Sched_IDInto #MinutesWithExceptionFrom   DayMinute As DM  Inner Join #SD As SD    On DM.Minute Between SD.Start_Minute And SD.Start_Minute   LengthSelect  MWE.Sched_ID, SH.[Date], SH.Agent_ID, [Start_Minute] = MWE.Minute, [End_Minute] = (Select Min(Last.Minute) -- First one to have no successor                  From #MinutesWithException As Last                  Where Last.Sched_ID = MWE.Sched_ID                    And Last.Minute > MWE.Minute                    And Not Exists(Select *                                   From #MinutesWithException As Next                                   Where Next.Sched_ID = MWE.Sched_iD                                     And Next.Minute = Last.Minute   1))From   #MinutesWithException As MWE  Inner Join #SH As SH    On MWE.Sched_ID = SH.Sched_IDWhere  Not Exists(Select * -- All those without predecessor             From #MinutesWithException As Previous             Where Previous.Sched_ID = MWE.Sched_ID               And Previous.Minute = MWE.Minute - 1)请记住,它们可以通过重写来解决很多问题SQL问题。不要问什么范围没有间隔,哪些分钟有间隔。其余的都从那里开始。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则