2014-10-01 37 views
0

我有一個任務要解決。我試圖在一個圖表中顯示兩臺機器的操作時間(編號爲&的編號2)。因此我將信息存儲在一個表中。這些列是id,date,number1,number2。 讓我們假設我有這個特定的數據集:C#根據sql查詢從兩行計算差異

id date  number1 number2 

    1| 24.09.14 | 100 | 120 

    2| 01.10.14 | 150 |  160 

爲了顯示我需要檢索以下數據中的信息。

((number1(2)- number1(1)) + number2(2) - number1(1))/2)/(number of days (date2 - date1)) 

這應該導致以下具體數字。

((150-100 + 160-120)/2)/7= 6,42 

或者用普通話說。結果應該是我所有機器的平均日常運行時間。從日期數量中去除星期六和星期日將會很好,但不是必需的。

我希望你能理解我的問題。本質上,我面臨的問題是,我不知道如何使用簡單的SQL查詢中的不同行。 編程語言是基於剃刀的Web項目中的c#。

+1

我懷疑你可以用'simple'查詢來做到這一點。考慮一下存儲過程。 – Reniuz 2014-10-01 07:13:28

+0

是否要計算特定日期的所有日期的平均值? – yogi970 2014-10-01 07:14:16

+0

而不是去存儲過程。嘗試** LINQ **。一個構造良好的linq語句查詢數據集應該會對你有所幫助。 – Gowtham 2014-10-01 07:23:47

回答

0

先上我懷疑你只有2數據庫記錄。這裏有一些代碼可以爲DataSet中的每兩行計算一次。

for(int i=0; i < dst.Tables[0].Rows.Count - 1; i+=2) 
{ 
    if(dst.Tables[0].Rows.Count % 2 != 0) 
     Console.WriteLine("Wrong records count") 

    int number1Row1 =Convert.ToInt32(dst.Tables[0].Rows[i]["Number1"]); 
    int number1Row2 =Convert.ToInt32(dst.Tables[0].Rows[i]["Number2"]); 
    int number2Row1 =Convert.ToInt32(dst.Tables[0].Rows[i+1]["Number1"]); 
    int number2Row2 =Convert.ToInt32(dst.Tables[0].Rows[i+1]["Number2"]); 

    DateTime dateRow1 =Convert.ToDateTime(dst.Tables[0].Rows[i]["Date"]); 
    DateTime dateRow2 =Convert.ToDateTime(dst.Tables[0].Rows[i+1]["Date"]); 

    double calc = ((number1Row2- number1Row1 + number2Row2 - number2Row1)/2)*(dateRow1 - dateRow2).TotalDays 

    Console.WriteLine(calc); 
} 

最大限度地明白理解。

0

是的,你可以用sql查詢。嘗試下面的查詢。

SELECT 
     N1.Date as PeriodStartDate, 
     N2.Date as PeriodEndDate, 
     CAST(CAST((((N2.number1- N1.number1) + (n2.number2 - N1.number2))/2) AS DECIMAL(18,2))/(datediff(d,n1.date,n2.date)) AS DECIMAL(18,2)) AS AverageDailyOperation 
FROM 
[dbo].[NumberTable] N1 
INNER JOIN 
[dbo].[NumberTable] N2 
ON N2.Date>N1.Date 

我假定表名爲NumberTable,我已經添加了PeriodStartDate和PeriodEndDate以使它有意義。您可以根據需要將其刪除。

0

你的一級方程式在你的數字樣本的前面可能是一個錯誤:
((數字1(2) - 數字1(1))+數字2(2) - 數(1))/ 2)/(天數(日期2 - 日期1))

如果id列的值是按時間順序排列的並且沒有空洞(1.2,3,4,...,但是1,3,4,6 KO .. )。你可以試試下面的腳本:

SELECT t2.number1 , t1.number1, t2.number2 , t1.number1 , DATEDIFF(DAY, t2.date, t1.date) 
, (((t2.number1 - t1.number1) + t2.number2 - t1.number2) /2)/DATEDIFF(DAY, t2.date, t1.date) as result 
FROM #tmp t1 
INNER JOIN #tmp t2 ON t1.id + 1 = t2.id 

--- I create a #tmp table for test 
CREATE table #tmp 
(
id int, 
Date DateTime, 
number1 float, 
number2 float 
) 

--- insert samples data 
INSERT INTO #tmp (id, Date, number1, number2) VALUES (1, '2014-09-24T00:00:00', 100, 120), (2, '2014-10-01T00:00:00', 150, 160) 

它工作的偉大我的SQL Server