簡體   English   中英

c#數據表,使用compute計算行范圍內的平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM