2017-10-17 28 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();