Расчеты в таблице данных - PullRequest
2 голосов
/ 29 марта 2010

У меня есть таблица данных с результатами опроса, и я хочу сделать определенные расчеты на этих данных. Структура данных выглядит примерно так: (не обращайте внимания на одинаковые данные, я вырезал и вставил все строки)

____________________________________________________________________________________
| 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 |
------------------------------------------------------------------------------------

Итак, каждый человек принадлежит к группе и ответил на несколько вопросов. Эти вопросы всегда сгруппированы по ключам и подразделам.

Существует ли какой-либо простой метод для расчета средних значений, отклонений и тому подобного на основе группировок. Что-то вроде

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

Я думаю, что я спрашиваю, что было бы лучшим способом структурировать данные в C #, чтобы с ним было как можно проще работать? Я начал делать уроки для каждой сущности, но где-то запутался, и что-то перестало работать. Поэтому, прежде чем я продолжил идти по этому пути, мне было интересно, есть ли другие, лучшие способы сделать это?

(Каждый человек также может иметь описывающие переменные, например, возрастную группу и тому подобное, но это не важно для базовой функциональности.)

Наше текущее решение делает все вычисления встроенными в запросы при запросе данных из базы данных. Это работает, но это медленно, и количество запросов равняется вопросам * индивидуумам + ключам * индивидуумам, которых может быть много, если отдельные запросы.

Есть предложения?

Ответы [ 3 ]

0 голосов
/ 10 апреля 2010

Средние значения, среднеквадратичные отклонения и некоторые другие вещи можно рассчитать, взяв данные за один проход и накапливая количество, сумму, сумму квадратов точек данных. Это было использовано за несколько дней до появления компьютеров, когда вы перфорировали все данные на карточках, как показано на рисунке, и пропускали их через карточные автоматы (запрограммированные проводами, подключенными к платам), собирали эти итоги и выполняли вычисления.

Это скучный урок истории, за исключением того, что он иллюстрирует, что вы можете иметь возможность полу-суммировать свои данные по группам, как вы берете их из базы данных.

Также будет полезно установить индексы для описательных (групповых) столбцов.

0 голосов
/ 16 июля 2014

Представляют ли значения, подобные 1,7,5, перечисленные в столбцах с именем «q» в вашей таблице, фактические ответы или количество правильных ответов?

В любом случае, вы можете использовать таблицу данных со следующими полями для организации ваших данных:

GroupID, IndividualID, KeyID, SubKeyID, QuestionID, Ответ

0 голосов
/ 29 марта 2010

Я сомневаюсь, что вы получите значительное улучшение, перенеся вычисления из базы данных в приложение.

Я бы порекомендовал посмотреть на структуру базы данных, чтобы увидеть, сможете ли вы улучшить ее за счет нормализации и добавления индексов. Большинство баз данных поставляются с инструментами, которые могут давать рекомендации по проектированию на основе заданного запроса. Затем посмотрите на запрос, который вы выполняете, чтобы увидеть, есть ли более эффективный способ написания вашего запроса. Я лично видел запросы, которые берут O (n) и переписывают в O (log n). Если вам нужна помощь с этим постом, вы можете написать столько дизайна и запросов, сколько вам удобно.

...