在 Access 2007 中使用 Group By 计算中位数的最佳方法

Noa*_*ahD 4 sql ms-access ms-access-2007 median

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

身份证价格
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;
Run Code Online (Sandbox Code Playgroud)

结果:

预订平均价格
书1 12.3333333333333
书2 5

Fio*_*ala 5

Jet SQL 中没有中位数,除非它是在 2007 年添加的,但这里有一个如何获取中位数的想法。你会需要 ...

一些SQL...

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

以及用户定义函数 (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
Run Code Online (Sandbox Code Playgroud)

来自:LessThanDot 维基