2010-03-29 11 views
2

J'ai un tableau de données avec les résultats de l'enquête, et je veux faire certains calculs sur ces données. La structure de données est un peu comme ceci: (ignorer toutes les données étant similaires, je coupé et collé toutes les lignes)Calculs dans une table de données

____________________________________________________________________________________ 
| group |individual |  key   |  key   |  key   | 
|  |   |subkey|subkey|subkey|subkey|subkey|subkey|subkey|subkey|subkey| 
|  |   |q|q|q |q |q |q|q|q |q|q|q |q |q |q|q|q |q|q|q |q |q |q|q|q | 
|-------|-----------|-|-|--|--|---|-|-|--|-|-|--|--|---|-|-|--|-|-|--|--|---|-|-|--| 
| 1 | 0001  |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 | 
| 1 | 0002  |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 | 
| 1 | 0003  |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 | 
| 2 | 0004  |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 | 
| 2 | 0005  |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 | 
| 3 | 0006  |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 | 
| 4 | 0007  |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 |1|7|5 |1 |3 |1|4|1 | 
------------------------------------------------------------------------------------ 

Ainsi, chaque individu appartient à un groupe, et a répondu à quelques questions. Ces questions sont toujours regroupées en clés et sous-clés.

Existe-t-il une méthode simple pour calculer les moyennes, les écarts et similaires en fonction des regroupements. Quelque chose comme

public float getAverage(int key, int individual); 
float avg = getAverage(5,7); 

Je pense que ce que je demande est ce qui serait la meilleure façon de structurer les données en C# pour le rendre aussi facile que possible de travailler? J'ai commencé à faire des cours pour chaque entité, mais j'ai été confus quelque part et quelque chose a cessé de fonctionner. Alors avant de continuer sur cette voie, je me demandais s'il y avait d'autres façons de faire cela?

(Chaque individu peut également décrire les variables, comme agegroup et autres, mais ce n'est pas important pour la fonctionnalité de base.)

Notre solution actuelle fait tous les calculs en ligne dans les requêtes lorsque vous demandez les données de la base de données. Cela fonctionne, mais il est lent et le nombre de requêtes est égal à des questions * individus + clés * individus, ce qui pourrait être beaucoup si des requêtes individuelles.

Des suggestions?

Répondre

0

Je doute que vous obtiendrez beaucoup d'amélioration en déplaçant les calculs de la base de données vers une application.

Je vous recommande de regarder la conception de base de données pour voir si vous pouvez l'améliorer grâce à la normalisation et en ajoutant des index. La plupart des bases de données sont livrées avec des outils qui peuvent faire des recommandations de conception basées sur une requête donnée. Ensuite, examinez la requête que vous exécutez pour voir s'il existe un moyen plus efficace d'écrire votre requête. J'ai personnellement vu des requêtes qui prennent O (n) réécrit pour prendre O (log n). Si vous avez besoin d'aide pour ce poste, autant de votre conception et de vos requêtes que vous êtes à l'aise avec le partage.

0

Les moyennes, écarts-types et autres peuvent être calculés en effectuant un passage sur les données et en accumulant le compte, la somme, la somme du carré des points de données. Cela a été exploité dans les jours avant les ordinateurs en perforant toutes les données sur les cartes comme vous l'illustrez, et en les exécutant à travers des machines à cartes (programmées par des fils branchés sur des cartes), et accumulant ces totaux, puis en faisant les calculs.

Ce qui est une leçon d'histoire ennuyeuse, sauf qu'elle illustre que vous pouvez être en mesure de semi-résumer vos données par groupe que vous le prenez de la base de données.

Il sera également payant d'être mis en place des index sur les colonnes descriptives (groupe).

0

Est-ce que les valeurs comme 1,7,5 listées sous les colonnes "q" dans votre tableau représentent les réponses réelles, ou le nombre de réponses correctes?

Quoi qu'il en soit, vous pouvez utiliser une table de données avec les champs suivants pour organiser vos données:

GroupID, IndividualID, KeyID, SubKeyID, QuestionID, réponse