|
可能由于强迫症吧,很多人对于分组行号都有着深深的迷恋。为此,两年前也写过一篇相关的帖子:【新手入门】之二十二:分组行号
不过我一直不知道这个有什么应用。今天在某论坛上看到有人提及中位数的计算,忽然觉得,也许这就是其中的一个应用吧。
中位数,通常需要先按一定的规则排序,然后在排序后的记录里找出最中间的一个(记录数为奇数)或者两个(记录数为偶数),然后求均值,即为中位数。如果需要分类别处理,那么前面提及的分组行号就派上用场了。
操作顺序如下:
1、根据条件(比如,按给定时间区间)生成查询结果表。
2、把1的结果追加到临时表。
3、更新临时表的分组行号。
4、求出临时表最中间的行号。这时候我们可以用高斯求和定律来计算,用(最大值+最小值)/2即为最中间的行号。
5、根据4的结果是整数还是小数来求出实际区间。如果是整数,说明记录数恰好在中间位置。直接查临时表中这个行号的数据即可;如果是小数,说明这个数介乎两个最中间的数值中间,因此需要±0.5来处理。
说完顺序后,下面就是处理过程了。简要说明下各个组件:
data——原始数据
qry_Detail——查询结果表,对应上述的操作步骤1
median——临时表,对应上述的操作步骤2,数据结构上比原始数据多一个”排序“字段。
qry_position——位置表,对应上述的操作步骤4和5,确定起止位置。用于最终结果的条件查询。
qry_result——结果表,求出指定条件下,各个商品ID的中位数。
frm_Main——主窗体,用于自动化操作步骤1-5。
frm_Detail——展示结果表的窗体。
mod_Median——主体过程,用于生成分组序号。代码如下:
- Sub updateRowID()
- Dim rst As New ADODB.Recordset
- Dim strGroup As String
- Dim lngPosition As Long
-
- DoCmd.SetWarnings False
- DoCmd.RunSQL "delete * from median"
- DoCmd.RunSQL "insert into median select *, 0 as 排序 from qry_Detail order by 日期,商品ID"
-
- rst.Open "select * from median", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
- '初始化
- lngPosition = 0
- strGroup = rst("商品ID")
-
- Do Until rst.EOF
- If rst("商品ID") = strGroup Then
- lngPosition = lngPosition + 1
- rst("排序") = lngPosition
- Else
- rst("排序") = 1
- lngPosition = 1
- strGroup = rst("商品ID")
- End If
- rst.Update
- rst.MoveNext
- Loop
-
- rst.Close
- Set rst = Nothing
- End Sub
复制代码 其它就不一一解释了。具体请查看附件。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|