Foxtable(狐表)用户栏目专家坐堂 → 集合中取掉最大最小值后,计算平均值


  共有2203人关注过本帖树形打印复制链接

主题:集合中取掉最大最小值后,计算平均值

帅哥哟,离线,有人找我吗?
ZJZK2018
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:767 积分:6119 威望:0 精华:0 注册:2018/2/1 17:26:00
集合中取掉最大最小值后,计算平均值  发帖心情 Post By: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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:4632 积分:33804 威望:0 精华:0 注册:2008/8/31 22:44:00
  发帖心情 Post By:2018/7/14 6:52:00 [只看该作者]

这个算法不准确,比如可能存在几个相同的最大值或最小值

 回到顶部
帅哥,在线噢!
y2287958
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:4632 积分:33804 威望:0 精华:0 注册:2008/8/31 22:44:00
  发帖心情 Post By: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(" & 最大值 & "," & 最小值 & ")")

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106460 积分:541447 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/7/14 9:19:00 [只看该作者]

3楼思路不错

 回到顶部
帅哥哟,离线,有人找我吗?
lihe60
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6827 积分:43183 威望:0 精华:0 注册:2009/3/2 14:07:00
  发帖心情 Post By:2018/7/14 10:39:00 [只看该作者]

3楼有个问题,如果最大值或最小值不止一个就有问题了。
如全部是100,则平均值就是0了

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106460 积分:541447 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/7/14 10:48:00 [只看该作者]

那要看你最终的需求是什么了,是只去掉其中一个,还是去掉全部的

 回到顶部
帅哥哟,离线,有人找我吗?
lihe60
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6827 积分:43183 威望:0 精华:0 注册:2009/3/2 14:07:00
  发帖心情 Post By:2018/7/14 11:04:00 [只看该作者]

楼主的意思应该是去掉一个最大值和一个最小值。
[此贴子已经被作者于2018/7/14 13:42:09编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106460 积分:541447 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:767 积分:6119 威望:0 精华:0 注册:2018/2/1 17:26:00
  发帖心情 Post By: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


 回到顶部