2017-10-17 27 views
1

我有一个物联网产品的应用这些产品的报告间隔或错误的服务器。现在我想创建一份关于产品稳定性的报告,并且我有以下数据。交换机的时差和金额的总和

ID ReportTime (DateTime) InError 
1 2017-17-10 03:00:00  False 
1 2017-17-10 03:30:00  True 
1 2017-17-10 04:00:00  False 
1 2017-17-10 05:00:00  False 
1 2017-17-10 06:00:00  True 
1 2017-17-10 07:00:00  True 
1 2017-17-10 08:00:00  False 

我想了解该产品已经多长时间了InError和频率,以便与上面的例子中,它应该返回 2倍的二点30分零零秒

值我怎样才能做到这一点使用EF/linq还是必要时使用SQL?

+0

看起来产品是InError 3次。你怎么来2次? –

+0

如果您打算在SQL中执行此操作,那么您的数据库是什么? –

+0

数据库是MSSQL,产品出错2次,因为只有在每一次虚假和真实记录之间的切换时它都应该计入一个新的状态。 –

回答

0

我不是EF或linq的专家,但是如果您使用的是MySql,例如您可以使用一个像这样的查询(使用临时变量)。这更像是一个伪代码,你需要对它进行调整,特别是对于日期计算,但它显示了这个想法。

SELECT InError,sum(errorDuration) from (
    SELECT ID, 
      ReportTime , 
      InError , 
      @prevReportTime :=ReportTime, 
      [email protected] as errorDuration 
    FROM thetable 
    JOIN (SELECT @prevReportTime := (SELECT min(ReportTime) from the table)) t 
    ORDER BY ReportTime 
) group by InError 

在SQL Server中,你可以使用LAG功能在由ReportTime做类似的事情: 喜欢的东西

ReportTime - LAG(ReportTime) OVER (ORDER BY ReportTime) errorDuration 

或者你可以使用秩()和临时表:

select rank() OVER (ORDER BY ReportTime) as 'Rank', value into temp1 from theTable 

select t1.inError, t1.ReportTime- t2.ReportTime as duration from temp1 t1, temp1 t2 
where t1.Rank = t2.Rank - 1 

这个想法是让以前的时间和每一行有自上次报告以来的持续时间。之后,当你有这个“视图”时,你只需通过InError求和该持续时间并分组即可获得错误状态和正常状态的持续时间。大多数数据库允许你这样做,但它通常涉及特定功能

0

试试这个solution。这是Insertstart项目不inError状态的重要成data在第一的位置,因为第一inError行也可以是整套行中第一,在这种情况下,你应该有上一行的话,进行差分和有效switches计算:

var start = DateTime.Today; 
//for example, fetch data for current day 
var data = db.Table.Where(x => x.Datetime >= start && x.Datetime < tomorrow).ToList(); 

data.Insert(0, new Log { InError = false, DateTime = start }); 

var time = new TimeSpan(data.Where(x => x.InError).Sum(x =>    
    (x.DateTime - data[data.IndexOf(x) - 1].DateTime).Ticks 
)); 

var switches = data.Where(x => x.InError && !data[data.IndexOf(x) - 1].InError).Count();