通过窗口函数查询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;