C#基于sql查询计算两行的差异

本文关键字:两行 sql 基于 查询 计算 | 更新日期: 2023-09-27 18:25:07

我有一个任务要解决。我试图用图表显示两台机器(1号和2号)的运行时间。因此,我将信息存储在一个表中。列为id、date、number1和number2。假设我有这个特定的数据集:

 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#。

C#基于sql查询计算两行的差异

首先,我怀疑数据库中只有2条记录。这里有一些代码对数据集中的每2行进行计算。

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);
}

它被写得最清楚易懂。

您的公式可能在数字样本前面有一个错误:
((数字1(2)-数字1(1))+数字2(2)–数字2(1)/2)/(天数(日期2-日期1))

如果值​​id列的是按时间顺序排列的,没有漏洞(1.2,3,4,…可以,但1,3,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 上运行得很好

是的,您可以使用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以使其有意义。您可以根据需要将其移除。