Объединение нескольких таблиц с некоторыми общими полями в одну таблицу - PullRequest
1 голос
/ 29 сентября 2011

У меня есть серия текстовых файлов (по одному в год), которые содержат ответы на ежегодный опрос / вопросник. Заголовки столбцов в файлах относятся к номерам вопросов, и каждая строка представляет ответы одного человека на вопросы, например,

Q1,   Q2,   Q3, ...
P1A1, P1A2, P1A3, ...
P2A1, P2A2, P2A3, ...
etc.
[where Q1 is Question 1, P1 is Person 1 and A1 is Answer 1].

В вопроснике каждый год используется один и тот же основной набор вопросов, но каждый год также добавляются новые вопросы и удаляются некоторые старые. Поэтому в моих таблицах много общих полей, но они не все одинаковые, например,

Year 1             |  Year 2           |  Year 3              etc.
Q1,   Q2,   Q3     |  Q1,   Q2,   Q4   |  Q1,   Q2,   Q5
P1A1, P1A2, P1A3   |  P1A1, P1A2, P1A4 |  P1A1, P1A2, P1A5
P2A1, P2A2, P2A3   |  P2A1, P2A2, P2A4 |  P2A1, P2A2, P2A5

В этом примере Q1 и Q2 являются основными вопросами, а вопросы 3, 4 и 5 зависят от года проведения опроса.

Удаленные номера вопросов никогда не используются повторно: если добавляется новый вопрос, ему присваивается совершенно новый номер. В реальных опросах содержится от 300 до 500 вопросов, и каждый год на них отвечают около 40 000 человек.

Я хочу объединить все эти данные в одну таблицу, заголовки столбцов которой будут представлять собой набор различных заголовков в исходных файлах плюс столбец для года. В течение многих лет, когда вопрос не имеет отношения, я хотел бы иметь нулевые значения, например

Year,  Q1,   Q2,   Q3,   Q4,   Q5
1,     P1A1, P1A2, P1A3, Null, Null
1,     P2A1, P2A2, P2A3, Null, Null
2,     P1A1, P1A2, Null, P1A4, Null
2,     P2A1, P2A2, Null, P2A4, Null
3,     P1A1, P1A2, Null, Null, P1A5
3,     P2A1, P2A2, Null, Null, P2A5

По сути, я просто хочу добавить столбцы там, где они совпадают и в противном случае имеют нулевые значения, но, если возможно, я бы хотел автоматически генерировать набор заголовков столбцов для финальной таблицы (из входных таблиц) в виде числа вопросов в опрос велик, и перспектива разработки и последующего набора Create Table ужасна! Я полагаю, что мне нужен какой-то вариант UNION ALL, который не требует от меня указания всех столбцов по порядку и который может обрабатывать несовпадающие столбцы.

У кого-нибудь есть какие-либо советы или предложения, пожалуйста? Изначально я надеялся использовать SQLite, но я готов попробовать практически все. Я не эксперт по базам данных, но у меня есть общее представление о SQL, и я могу немного поработать над сценариями Python, если это поможет.

Если вы сделали это так, спасибо за чтение! Я думал, что это будет очень простая проблема, но удивительно сложно описать подробно.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Шаг 1. Остановите кодирование.

Шаг 2. Купите книгу по хранилищу данных и дизайну звездообразной схемы.Например, набор инструментов Ральфа Кимбалла для хранилищ данных.http://www.amazon.com/Data-Warehouse-Toolkit-Complete-Dimensional/dp/0471200247

Шаг 3. Создайте правильную звездную схему.Вопрос это измерение.Время (в частности, год) - это измерение.Респондент (если вы их знаете) - это измерение.Ответ (индивидуальный инструмент опроса) - это измерение.Факты - это ответы на вопросы определенного года.Каждый опрос становится множеством рядов фактов.

Шаг 4. Загрузите схему типа «звезда» с данными за разные годы.Измерения (вопросы) немного сложны для загрузки, потому что каждый год повторно использует некоторые вопросы и добавляет новые.Как только измерения загружены, строки фактов загружаются довольно просто.

Шаг 5. Теперь вы можете написать приложение для создания быстрых отчетов, которое извлечет необходимые данные из различных строк фактов и соберет нужный отчет.

1 голос
/ 29 сентября 2011

Вот примерный набросок кода sudo с использованием только базовых элементов Python

иметь основной список для всех «записей»

  • прочитайте в первой строке вашего файла, получив все вопросы
  • создайте набор () и добавьте в него все вопросы всех лет
  • создать словарь с ключами в качестве вопроса
  • дополнительно добавьте ключ для имени человека и года
  • загрузить новый словарь для каждого человека и добавить его в свой список
  • сделать это для каждого файла, если у вас есть список словарей
  • создайте себе функцию форматирования, которая запрашивает element_in_list.has_key («вопрос из набора вопросов») ... если это так, отлично, если нет, выведите «NONE» или w / e

ваш набор () вопросов должен быть приведен к списку (), чтобы сохранить порядок в окончательном выводе

[
  {"year":"2001","name":"bob","q1":"hello"}
  {"year":"2011","name":"rob","q5":"world"}
]
1 голос
/ 29 сентября 2011

Во-первых, SQLite не будет иметь причудливых возможностей более крупной СУБД.Если вы не хотите писать фрагмент оператора select для каждого вопроса, вам нужна сводная таблица, которой нет в SQLite.

Исходный формат сбивает с толку - я бы создал одну таблицу сстолбцы Персона, Вопрос, Ответ и Год.(Разберитесь с человеком и номером вопроса.) И перейдите к нему оттуда.Если это не работает, используйте исходный формат в одной таблице.Исходя из этого, вычисление финальной таблицы - это то, что вы можете легко сделать в Python вместо SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...