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#。
首先,我怀疑数据库中只有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以使其有意义。您可以根据需要将其移除。