高分悬赏,高手请进

山间竹笋 2019-06-27 11:50:19
有2张表,第一张是基础信息,sSignalPoint 是请求停线信号,iSignalPointNUM 是请求停线信号的编号;sFPSPoint是实际停线信号,iFPSPointNUM是实际停线信号的编号
第二张表T_StopTime是信号时间记录, sPoint 是编号, tStart 是开始时间,tEnd是结束时间。
我想把T_StopTime里的2个时间关联到一起,实际停线的开始时间,插到 请求时间的中间



表名 T_Signla
字段 sInputDesc sSignalPoint iSignalPointNUM sStopPoint iStopNUM
第一生产线 请求停线1 S1 实际停线1 S11
第二生产线 请求停线2 S2 实际停线2 S12
第三生产线 请求停线3 S3 实际停线3 S13
第四生产线 请求停线4 S4 实际停线4 S14
第五生产线 请求停线5 S5 实际停线5 S15
第六生产线 请求停线6 S6 实际停线6 S16

表名 T_StopTime
字段 sNum tStart tEnd
s1 2019-5-16 12:30 2019-5-16 12:40
S11 2019-5-16 12:35 2019-5-16 12:39
s2 2019-5-16 13:30 2019-5-16 13:40
S12 2019-5-16 13:33 2019-5-16 13:39
S1 2019-6-16 13:33 2019-6-16 13:39
S2 2019-6-16 14:33 2019-6-16 14:39
想得到的结果:

生产线 请求信号 请求时间 停线时间 请求结束
第一生产线 请求停线1 2019-5-16 12:30 2019-5-16 12:35 2019-5-16 12:40
第二生产线 请求停线2 2019-5-16 13:30 2019-5-16 13:33 2019-5-16 13:40
第一生产线 请求停线1 2019-6-16 13:33 2019-6-16 13:39
第二生产线 请求停线2 2019-6-16 14:33 2019-6-16 14:39
...全文
75 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2019-06-27
  • 打赏
  • 举报
回复

create table T_Signla	
(sInputDesc varchar(20),sSignalPoint varchar(20),iSignalPointNUM varchar(10),sStopPoint varchar(20),iStopNUM varchar(10))

insert into T_Signla
 select '第一生产线','请求停线1','S1','实际停线1','S11' union all
 select '第二生产线','请求停线2','S2','实际停线2','S12' union all
 select '第三生产线','请求停线3','S3','实际停线3','S13' union all
 select '第四生产线','请求停线4','S4','实际停线4','S14' union all
 select '第五生产线','请求停线5','S5','实际停线5','S15' union all
 select '第六生产线','请求停线6','S6','实际停线6','S16'

create table T_StopTime	
(sNum varchar(10),tStart varchar(20),tEnd varchar(20))

insert into T_StopTime
 select 's1','2019-5-16 12:30','2019-5-16 12:40' union all
 select 'S11','2019-5-16 12:35','2019-5-16 12:39' union all
 select 's2','2019-5-16 13:30','2019-5-16 13:40' union all
 select 'S12','2019-5-16 13:33','2019-5-16 13:39' union all	
 select 'S1','2019-6-16 13:33','2019-6-16 13:39' union all
 select 'S2','2019-6-16 14:33','2019-6-16 14:39'


select 生产线=b.sInputDesc,
       请求信号=b.sSignalPoint,
       请求时间=a.tStart,
       停线时间=isnull((select top 1 c.tStart 
                       from T_StopTime c 
                       inner join T_Signla d on c.sNum=d.iStopNUM
                       where d.sInputDesc=b.sInputDesc 
                       and c.tStart between a.tStart and a.tEnd),''),
       请求结束=a.tEnd
 from T_StopTime a
 inner join T_Signla b on a.sNum=b.iSignalPointNUM
 order by a.tStart

/*
生产线                  请求信号                 请求时间                 停线时间                 请求结束
-------------------- -------------------- -------------------- -------------------- --------------------
第一生产线                请求停线1                2019-5-16 12:30      2019-5-16 12:35      2019-5-16 12:40
第二生产线                请求停线2                2019-5-16 13:30      2019-5-16 13:33      2019-5-16 13:40
第一生产线                请求停线1                2019-6-16 13:33                           2019-6-16 13:39
第二生产线                请求停线2                2019-6-16 14:33                           2019-6-16 14:39

(4 行受影响)
*/
山间竹笋 2019-06-27
  • 打赏
  • 举报
回复
上边的解决了有停线的情况,没有停线的记录出不来,高手想想办法
山间竹笋 2019-06-27
  • 打赏
  • 举报
回复
SELECT sInputDesc, sSignalPoint, b.tStart, ( SELECT TOP 1 tStart FROM T_StopTime WHERE sNum = a.iStopNUM AND tStart BETWEEN b.tStart AND b.tEnd ) AS tStart, b.tEnd FROM T_Signla a JOIN T_StopTime b ON a.iSignalPointNUM = b.sPoint;
RINK_1 2019-06-27
  • 打赏
  • 举报
回复
借用#3版主的数据

if object_id(N'tempdb.dbo.#T_Signla') is not null
drop table #T_Signla
go

create table #T_Signla   
(sInputDesc varchar(20),sSignalPoint varchar(20),iSignalPointNUM varchar(10),sStopPoint varchar(20),iStopNUM varchar(10))
 
insert into #T_Signla
 select '第一生产线','请求停线1','S1','实际停线1','S11' union all
 select '第二生产线','请求停线2','S2','实际停线2','S12' union all
 select '第三生产线','请求停线3','S3','实际停线3','S13' union all
 select '第四生产线','请求停线4','S4','实际停线4','S14' union all
 select '第五生产线','请求停线5','S5','实际停线5','S15' union all
 select '第六生产线','请求停线6','S6','实际停线6','S16'

if object_id(N'tempdb.dbo.#T_StopTime') is not null
drop table #T_StopTime
go

create table #T_StopTime   
(sNum varchar(10),tStart DATETIME,tEnd DATETIME)
 
insert into #T_StopTime
 select 's1','2019-5-16 12:30','2019-5-16 12:40' union all
 select 'S11','2019-5-16 12:35','2019-5-16 12:39' union all
 select 's2','2019-5-16 13:30','2019-5-16 13:40' union all
 select 'S12','2019-5-16 13:33','2019-5-16 13:39' union all   
 select 'S1','2019-6-16 13:33','2019-6-16 13:39' union all
 select 'S2','2019-6-16 14:33','2019-6-16 14:39'


SELECT B.sInputDesc,B.sSignalPoint,A.tStart,C.tStart,A.tEnd 
FROM #T_StopTime A
JOIN #T_Signla B ON A.sNum=B.iSignalPointNUM
OUTER APPLY (SELECT TOP 1 tStart FROM #T_StopTime WHERE B.iStopNUM=sNum AND tStart>=A.tStart ORDER BY tStart) AS C


22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧