Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sqlserver-query。返回故障间隔时间_Sql Server - Fatal编程技术网

Sql server sqlserver-query。返回故障间隔时间

Sql server sqlserver-query。返回故障间隔时间,sql-server,Sql Server,我有关于哪些构建通过和哪些构建失败的详细信息。我希望能够测量两次失败之间的时间(意味着两次失败之间至少有一次通过)。到目前为止,我已经链接了示例数据和示例查询 给定这些数据,我希望我的查询只输出2行 FailedDt | SecondFailedDt ------------------------------------------------- 1/2/2010 12:00:00 AM | 1/4/2010 12:00:00 AM 1/

我有关于哪些构建通过和哪些构建失败的详细信息。我希望能够测量两次失败之间的时间(意味着两次失败之间至少有一次通过)。到目前为止,我已经链接了示例数据和示例查询

给定这些数据,我希望我的查询只输出2行

FailedDt             |        SecondFailedDt
-------------------------------------------------

1/2/2010 12:00:00 AM |        1/4/2010 12:00:00 AM

1/6/2010 12:00:00 AM |        1/10/2010 12:00:00 AM

如何修改查询以获得所需的输出?

这可能比您的方法简单得多:

只需将其粘贴到一个空的查询窗口并执行。。。适应你的需要

declare @rsBuildDetails table(dt datetime, build varchar(255), val varchar(255));

insert into @rsBuildDetails (dt, build, val) values 
 ('20100101', '1', 'pass')
,('20100102', '2', 'fail')
,('20100103', '3', 'pass')
,('20100104', '4', 'fail')
,('20100105', '5', 'fail')
,('20100106', '6', 'fail')
,('20100107', '7', 'pass')
,('20100108', '8', 'pass')
,('20100109', '9', 'pass')
,('20100110', '10', 'fail');

with passed as
(
    select * 
    from @rsBuildDetails
    where val='pass'
)
select distinct preFail.dt AS FailedDt
               ,postFail.dt AS SecondFailedDt
from passed
outer apply(
    select top 1 pre.*
    from @rsBuildDetails as pre
    where pre.dt<passed.dt 
      and pre.val='fail'
    order by pre.dt desc
) as preFail
outer apply(
    select top 1 post.*
    from @rsBuildDetails as post
    where post.dt>passed.dt 
      and post.val='fail'
    order by post.dt asc
) as postFail
where preFail.dt IS NOT NULL and postFail.dt IS NOT NULL

一个好问题,thx为链接示例!在这里,您使用多个表来存储中间数据。这是一个给定的结构还是一个可以忽略的结构?请说明SQL Server的版本…非常感谢。看起来交叉应用比外部应用效果更好。然而,我实际上使用的是一个自定义数据库平台,它的工作原理与SQL相似,但并不完全是SQL。所以它没有交叉应用或外部应用。我也不完全理解交叉应用的作用。有没有办法不使用applicates重写此问题?@jyim89由于您的问题仅标记为“SQL Server”,因此您非常感谢投票并接受此问题的解决方案,并提出一个新的后续问题,即如何将其转换为“纯”ANSI SQL。如果你在这里发布新问题的链接,我会很快准备好答案。(声望点数上瘾:-)@shungo,抱歉还不是很熟悉stackoverflow:)。以下是新链接:
FailedDt                SecondFailedDt
2010-01-02 00:00:00.000 2010-01-04 00:00:00.000
2010-01-06 00:00:00.000 2010-01-10 00:00:00.000