我试图在数据表上使用 .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 {"Cannot find column [Rows]."} - 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,6118.800,6054.700,6014.700,6198.000,6242.800,6272.900 , 6250.700, 6213.500, 6207.000, 6184.200, 6333.200
你将无法以你接近它的方式做到这一点。
要使用该.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()
;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句