以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 集合中取掉最大最小值后,计算平均值 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=121852) |
-- 作者:ZJZK2018 -- 发布时间:2018/7/14 1:32:00 -- 集合中取掉最大最小值后,计算平均值 如题, 除了下面这段代码后,有没有其他更好的办法来处理? Dim drs As List(Of DataRow) Dim sum As Double Dim avg As Double drs = DataTables("开标记录").Select("[公司报价] > 0","公司报价 DESC") drs.Remove(drs(0)) drs.Remove(drs(drs.Count -1)) For Each dr As DataRow In drs sum += dr("公司报价") Next avg = sum / drs.Count Output.Show(avg) |
-- 作者:y2287958 -- 发布时间:2018/7/14 6:52:00 -- 这个算法不准确,比如可能存在几个相同的最大值或最小值 |
-- 作者:y2287958 -- 发布时间:2018/7/14 7:49:00 -- Dim 最大值 As Double = DataTables("表A").Compute("max(第一列)") Dim 最小值 As Double = DataTables("表A").Compute("min(第一列)") Dim 平均值 As Double = DataTables("表A").Compute("avg(第一列)","第一列 not in(" & 最大值 & "," & 最小值 & ")") |
-- 作者:有点蓝 -- 发布时间:2018/7/14 9:19:00 -- 3楼思路不错 |
-- 作者:lihe60 -- 发布时间:2018/7/14 10:39:00 -- 3楼有个问题,如果最大值或最小值不止一个就有问题了。 如全部是100,则平均值就是0了
|
-- 作者:有点蓝 -- 发布时间:2018/7/14 10:48:00 -- 那要看你最终的需求是什么了,是只去掉其中一个,还是去掉全部的 |
-- 作者:lihe60 -- 发布时间:2018/7/14 11:04:00 -- 楼主的意思应该是去掉一个最大值和一个最小值。 [此贴子已经被作者于2018/7/14 13:42:09编辑过]
|
-- 作者:有点蓝 -- 发布时间:2018/7/14 11:12:00 -- 那可以这样 Dim dr1 As DataRow = DataTables("开标记录").Find("[公司报价] > 0","公司报价 desc") Dim dr2 As DataRow = DataTables("开标记录").Find("[公司报价] > 0","公司报价") Dim 平均值 As Double = DataTables("开标记录").Compute("avg(公司报价)","[_Identify] not in(" & dr1("_Identify") & "," & dr2("_Identify") & ")") |
-- 作者:ZJZK2018 -- 发布时间:2018/7/14 17:07:00 -- 谢谢老师搞定: Dim mdrzg As DataRow = e.DataTable.Find("[项目编号] = \'" & dr("项目编号") & "\' And [优惠率_最高限价] <> 0 ","优惠率_最高限价 DESC") Dim ndrzg As DataRow = e.DataTable.Find("[项目编号] = \'" & dr("项目编号") & "\' And [优惠率_最高限价] <> 0 ","优惠率_最高限价") Dim cnt As Integer = e.DataTable.Compute("Count(优惠率_最高限价)","[项目编号] = \'" & dr("项目编号") & "\' And [优惠率_最高限价] <> 0") Dim fil As String = "[项目编号] = \'" & dr("项目编号") & "\' And [优惠率_最高限价] <> 0 And [_Identify] not In(" & mdrzg("_Identify") & "," & ndrzg("_Identify") & ")" If cnt > 0 Then If cnt > 3 Then fdr("评标优惠率平均值_最高限价") = e.DataTable.Compute("Avg(优惠率_最高限价)",fil) Else fdr("评标优惠率平均值_最高限价") = e.DataTable.Compute("Avg(优惠率_最高限价)","[项目编号] = \'" & dr("项目编号") & "\' And [优惠率_最高限价] <> 0") End If Else fdr("评标优惠率平均值_最高限价") = Nothing End If |