[AccessD] Median Number

Gustav Brock gustav at cactus.dk
Fri Nov 7 03:30:00 CST 2003


Hi Reuben

> Anyone have a good way to find the median value in a table of unkown number
> of records?

You could look up our own list at 2001-03-06:

<quote>

Sub GetTableMedian ()
  Dim dblMedian As Double
  dblMedian = GetTableMedian ("", "tblData", "FieldName")
  Debug.Print (dblMedian)
End Sub

Function GetTableMedian(strDatabase As String, strTable As String, strField
As String) As Double
  'strDatabase - name of the database to look in or "" for the current
database
  'strTable - name of the table to analyze
  'strField - name of the field to analyze
  'Returns: median

  Dim dbsTemp As Database
  Dim rstTemp As Recordset
  Dim strSQL As String
  Dim lngElements As Long
  Dim lngIndex As Long
  Dim fInterpolate As Boolean
  Dim dblMedian As Double

  If strDatabase = "" Then
    Set dbsTemp = CurrentDb()
  Else
    Set dbsTemp = DBEngine.Workspaces(0).OpenDatabase(strDatabase)
  End If

  strSQL = "SELECT DISTINCTROW [" & strField & "] FROM [" & strTable & "] "
  strSQL = strSQL & "WHERE ([" & strField & "] Is Not Null) "
  strSQL = strSQL & "ORDER BY [" & strField & "];"

  Set rstTemp = dbsTemp.OpenRecordset(strSQL)
  If Not rstTemp.EOF Then
    rstTemp.MoveLast
    lngElements = rstTemp.RecordCount
    If lngElements = 1 Then
      dblMedian = rstTemp(strField)
    Else
      lngIndex = Int((lngElements + 1) / 2)
      fInterpolate = (lngElements Mod 2 = 0)
      rstTemp.MoveFirst
      rstTemp.Move (lngIndex - 1)
      dblMedian = rstTemp(strField)
      If fInterpolate Then
        rstTemp.MoveNext
        dblMedian = (dblMedian + rstTemp(strField)) / 2
      End If
    End If
  Else
    dblMedian = 0
  End If

  rstTemp.Close
  dbsTemp.Close

  GetTableMedian = dblMedian

End Function

William Hindman

</quote>

/gustav



More information about the AccessD mailing list