Calcul de la médiane en .net avec oledbdatareader

Contenu du snippet

J'ai écrit cette fonction car je devait calculer une médiane statistique dans une application .Net

Il y a bien le code http://support.microsoft.com/kb/210581 qui est probablement le seul qui fonctionne réellement de façon correcte mais il n'est utilisable qu'en VBA.
En .Net, l'accès aux données se fait en utilisant System.Data.OleDb.OleDbDataReader qui parcourt le flux de données uniquement à sens unique.

Je vous propose une fonction Median adaptée à l'utilisation de OleDbDataReader.

Pour ceux que cela intéresse, vous trouverez également sur ce site une fonction Quantile permettant de calculer de façon plus générique aussi bine la médiane que n'importe quel autre centile.

Source / Exemple :


Private Function Median(ByVal Table As String, ByVal Field As String, ByVal Filter As String, ByVal Connexion As OleDbConnection) As Double
        Dim sFilter As String = ""
        If Not IsNothing(Filter) Then sFilter = "AND (" & Filter & ")"
        Dim SQLQuery As OleDbCommand = New OleDbCommand("SELECT COUNT([" & Field & "]) AS CNT FROM [" & Table & "] WHERE (([" & Field & "] IS NOT NULL) " & sFilter & ");", Connexion)
        Dim Reader As System.Data.OleDb.OleDbDataReader = SQLQuery.ExecuteReader
        Reader.Read()
        Dim RecordCount As Long = Reader(0)
        Reader.Close()
        Reader = Nothing
        SQLQuery = Nothing
        SQLQuery = New OleDbCommand("SELECT [" & Field & "] FROM [" & Table & "] WHERE (([" & Field & "] IS NOT NULL) " & sFilter & ") ORDER BY [" & Field & "];", Connexion)
        Reader = SQLQuery.ExecuteReader
        Dim MedianValue As Double
        Dim offset As Long
        If (RecordCount Mod 2) = 0 Then
            offset = (RecordCount / 2) - 1
            For i As Long = 0 To offset
                Reader.Read()
            Next i
            MedianValue = Reader(0)
            Reader.Read()
            Dim value2 As Double = Reader(0)
            MedianValue = (MedianValue + value2) / 2
        Else
            offset = ((RecordCount + 1) / 2) - 1
            For i As Long = 0 To offset
                Reader.Read()
            Next i
            MedianValue = Reader(0)
        End If
        Reader.Close()
        Reader = Nothing
        SQLQuery = Nothing
        Return MedianValue
    End Function

Conclusion :


L'exemple ci-dessous montre comment utiliser la fonction Median

Soit dans la base de données "MaDb.mdb", une table "Données" avec les données suivantes

+--------+-------+
| Events | Group |
+--------+-------+
| 10 | 1 |
| 11 | 1 |
| 14 | 2 |
| 10 | 1 |
| 8 | 1 |
| 10 | 2 |
| 15 | 2 |
| 9 | 1 |
| 8 | 1 |
| 10 | 1 |
| 12 | 2 |
| 13 | 2 |
+--------+-------+

Pour calculer ma médiane de "Events" pour le groupe "1", procéder comme

Dim DbComm As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="MaDb.mdb;")
DbComm.Open()
Dim Mediane As Double = Median( "[Données]" , "Events", "((Group)=1)" , DbComm)
DbComm.Close()
DbComm = Nothing

Remarquez les [] autour de "Données", obligatoire en Access si on utilise des lettres accentuées

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.