Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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状态更改:如何获取*状态块内*状态下的运行总时间?_Sql_Sql Server - Fatal编程技术网

通过窗口函数查询SQL Server状态更改:如何获取*状态块内*状态下的运行总时间?

通过窗口函数查询SQL Server状态更改:如何获取*状态块内*状态下的运行总时间?,sql,sql-server,Sql,Sql Server,我通过以下查询跟踪机器及其在不同州花费的时间: select ks.CalendarId , ks.machineid , ks.machinestateid , lead(ks.machinestateid) over (partition by ks.machineid, ks.calendarid order by ks.machinefmstatetime desc) prevstateid , ks.machinestatehistoryid

我通过以下查询跟踪机器及其在不同州花费的时间:

    select ks.CalendarId 
    , ks.machineid
    , ks.machinestateid
    , lead(ks.machinestateid) over (partition by ks.machineid, ks.calendarid order by ks.machinefmstatetime desc) prevstateid
    , ks.machinestatehistoryid
    , ks.machinefmstatetime
    , ks.StateTimeInSeconds
    , sum(ks.statetimeinseconds) over (partition by ks.machineid, ks.calendarid, ks.machinestateid order by ks.machinefmstatetime) StateTimeSecTotal
from [dbo].[MachineStateDailyDistributionFact] ks
where calendarid in (20180425)
    and ks.machineid in (38141)
order by ks.MachineFmStateTime
除了StateTimeSectal,这一切都很好。当一台机器回到之前某个时候的状态时,StateTimeSecttal会从它停止的地方恢复。我需要第二次计数“重新开始”

例如,在下面的图片中,我需要突出显示的单元格为0,然后继续进行计数,因为它已经是

当处于不同的“状态时间块”时,如何将查询更改为总状态持续时间“重新开始”

谢谢你的提示,
sff

您有一个缺口和孤岛问题。下面是一个使用
行号()的解决方案


行号的差异识别机器id状态的相邻组。

Ah。为了验证我的理解,这基本上是在说“既然我没有一个数据列可以按我想要的粒度进行划分,那么就用行号做一个。这就是它的要点吗?哦,谢谢!@sherifffruitfly…是的,这就是想法。
select . . .,
       sum(ks.statetimeinseconds) over (partition by ks.machineid, ks.calendarid, ks.machinestateid order by ks.machinefmstatetime) StateTimeSecTotal
select . . .,
       sum(ks.statetimeinseconds) over (partition by ks.machineid, ks.calendarid, ks.machinestateid, seqnum_1-seqnum_2 order by ks.machinefmstatetime) StateTimeSecTotal

from (select ks.*,
             row_number() over (partition by ks.machineid, ks.calendarid order by ks.machinefmstatetime) as seqnum_1,
             row_number() over (partition by ks.machineid, ks.calendarid, ks.machinestateid order by ks.machinefmstatetime) as seqnum_2
      from [dbo].[MachineStateDailyDistributionFact] ks
      where calendarid in (20180425) and ks.machineid in (38141)
     ) ks
order by ks.MachineFmStateTime;