以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  集合中取掉最大最小值后,计算平均值  (http://www.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