[英]c# datatable using compute to calculate an average on a range of rows
我試圖在數據表上使用.Compute,從而僅計算一組行的平均值。 我瀏覽了Microsoft文檔並搜索了一段時間,但找不到針對數據表結構的過濾器。 尋找類似的東西:-
string connectStatement = "SELECT Price FROM PData WHERE Code = '" + this.ItemCode + "' ORDER BY TradeDate DESC OFFSET 0 ROWS FETCH NEXT 300 ROWS ONLY";
DataTable itemsDT = ConnectionManager.GetTable(connectStatement);
Records20 = (decimal)itemsDT.Compute("Avg(Price)", "Rows > 16 AND Rows < 23");
使用空過濾器時它可以工作,但可以計算所有數據。
如果無法做到這一點,我正在考慮使用循環和求和后計算平均值。
編輯:我正在查看某個時間點的數據樣本,並平均每個范圍的范圍(例如,第20個間隔和第17-22行)
錯誤消息是$ exception {“找不到列[行]。”}-System.Data.EvaluateException
樣本數據(僅限於前30行):
價格6464.100,6426.800,6406.100,6349.300,6329.600,6295.500,6247.900,6189.100,6206.100,6214.600,6231.000,6130.200,6115.700,6129.500,6097.300,6159.600,6149.700,6118.400,6156.700,6800.6,600.600,6800.6600.600 ,6250.700,6213.500,6207.000,6184.200,6333.200
這是我使用循環的解決方案
decimal sumCalculation = 0;
for (int record = 17; record < 23; record++)
{
sumCalculation += decimal.Parse(itemsDT.Rows[record]["Price"].ToString());
}
Records20 = sumCalculation / 6;
您將無法以接近它的方式進行操作。
要使用.Compute
方法,您需要在過濾器表達式中傳遞列名-因為它是正常的WHERE
子句。 在T-SQL級別,您可以利用ROW_NUMBER
函數枚舉新列中返回的行(例如, 索引) ,然后將過濾器應用於該枚舉列。 例如,
string connectStatement = "SELECT ROW_NUMBER() OVER(ORDER BY TradeDate DESC) AS Index, Price FROM PData WHERE Code = '" + this.ItemCode + "' OFFSET 0 ROWS FETCH NEXT 300 ROWS ONLY";
DataTable itemsDT = ConnectionManager.GetTable(connectStatement);
Records20 = (decimal)itemsDT.Compute("Avg(Price)", "Index > 16 AND Index < 23");
另一種方法是借助LINQ
做到這一點,而將T-SQL查詢保留為:
string connect statement = "SELECT Price FROM PData WHERE Code = '" + this.ItemCode + "' ORDER BY TradeDate DESC OFFSET 0 ROWS FETCH NEXT 300 ROWS ONLY";
Records20 = itemsDT.AsEnumerable() // this will yeald a IEnumerable<DataRow>
.Skip(16)
.Take(7)
.Select(dr => (decimal)dr["Price"])
.Average()
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.