4

我有一张表,其中包含一本书,然后是关于这本书的多个价格(这是一个高度简化的示例):

身份证件价格
1 本书 1 10
2 书 1 15
3 书 1 12
4 书 2 8
5 书 2 2

我很容易计算平均值,但必须有一个很好的方法来计算中位数?

当前 SQL:

SELECT DISTINCTROW Books.BOOK, Avg(Books.PRICE) AS [Avg Of PRICE]
FROM Books
GROUP BY Books.BOOK;

结果:

图书平均价格
书 1 12.3333333333333
书 2 5

4

4 回答 4

4

Jet SQL 中没有 Median,除非它是为 2007 年添加的,但这里有一个关于如何获得的想法。你会需要 ...

一些 SQL ...

SELECT Statistics.Month, Sum(([SentTo])) AS [Sum Sent], fMedian("Statistics","Month",[Month],"SentTo") AS [Median Sent]
FROM Statistics
GROUP BY Statistics.Month;

和一个用户定义函数(UDF)。

Function fMedian(SQLOrTable, GroupFieldName, GroupFieldValue, MedianFieldName)
Dim rs As DAO.Recordset

Set db = CurrentDb
Set rs1 = db.OpenRecordset(SQLOrTable, dbOpenDynaset)

If IsDate(GroupFieldValue) Then
    GroupFieldValue = "#" & GroupFieldValue & "#"
ElseIf Not IsNumeric(GroupFieldValue) Then
    GroupFieldValue = "'" & Replace(GroupFieldValue, "'", "''") & "'"
End If

rs1.Filter = GroupFieldName & "=" & GroupFieldValue
rs1.Sort = MedianFieldName

Set rs = rs1.OpenRecordset()
rs.Move (rs.RecordCount / 2)

If rs.RecordCount Mod 2 = 0 Then
    varMedian1 = rs.Fields(MedianFieldName)
    rs.MoveNext
    fMedian = (varMedian1 + rs.Fields(MedianFieldName)) / 2
Else
    fMedian = rs.Fields(MedianFieldName)
End If

End Function

来自:LessThanDot Wiki

于 2009-03-12T20:28:21.487 回答
1

可以在 MS Access 中仅使用常规查询而不使用 VBA 来计算中值。中位数是第 50 个百分位数。因此,正常创建选择查询;然后进入 SQL 视图并在选择关键字后包含“Top 50 Percent”。对底部 50% 进行升序排序;降序排列前 50%。然后找到最低百分比结果集的最大值和最高百分比结果集的最小值。这两个的平均值是中位数。使用“前 50%”时,请确保查询中的条件特定于从中计算中位数的结果集。

于 2010-03-04T01:11:40.773 回答
0

我尝试使用非 VBA 方法,但它们都有一定的局限性,无法为更大的数据集提供最准确的结果。对于 Top 50 Percent Asc (Max) 和 Top 50 Percent Desc (Min) 方法,Access 有一个限制,并且在按升序排序时会忽略单个值。对于四舍五入,Access 使用银行家四舍五入,因此它并不总是根据值本身进行四舍五入,如果要向上或向下舍入,则需要添加 +-0.00001 的尾随值。我还尝试了另一种没有 VBA 的 Rank() 方法,并且 Access 在对具有至少一对相同值的值进行排名时遇到了问题。由于上述原因,我强烈建议坚持在 VBA 中创建自定义函数。

于 2019-04-05T17:38:23.787 回答
-1

没有内置函数 - 因此您必须使用代码循环记录并自己计算中位数。

使用google - 那里有很多代码示例

于 2009-03-12T20:22:36.023 回答