Добавление столбца в базу данных sqlite и распределение строк по первичному ключу - PullRequest
0 голосов
/ 11 марта 2019

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

timestamp |  items X sold
------------------------
1         |     10
4         |     40
7         |     20

Я храню эти данные в таблице SQLite.Теперь я хочу добавить в эту таблицу.Особенно, если я получаю данные о другом элементе Y. Данные элемента Y могут иметь или не иметь разные временные метки, но я хочу вставить эти данные в существующую таблицу, чтобы она выглядела следующим образом:

timestamp |  items X sold  | items Y sold
------------------------------------------
1         |     10         |      5
2         |     NULL       |      10    
4         |     40         |      NULL
5         |     NULL       |      3
7         |     20         |      NULL

Позжедополнительные данные о продажах (столбцы) должны быть добавлены по той же схеме.Есть ли простой способ сделать это с SQLite?В конце я хочу получить данные по отметке времени и получить обзор того, какие товары были проданы в это время.В большинстве примеров рассматривается вариант использования для добавления полной строки (одной записи) или полного столбца, если он полностью совпадает с другими столбцами.

Или sqlite - не тот инструмент вообще?И мне лучше использовать csv или excel?

(Использование пакета pylons sqlite3 для создания и управления БД)

Спасибо!

1 Ответ

0 голосов
/ 11 марта 2019

Динамическое добавление столбцов не является хорошим дизайном. Вы можете добавить их, используя

ALTER TABLE your_table ADD COLUMN the_column_name TEXT  
  • столбец для существующих строк будет заполнен нулями, хотя вы можете указать значение DEFAULT, и тогда существующие строки будут заполнены этим значением.

например. следующее демонстрирует вышесказанное: -

DROP TABLE IF EXISTS soldv1;
CREATE TABLE IF NOT EXISTS soldv1 (timestamp INTEGER PRIAMRY KEY, items_sold_x INTEGER);
INSERT INTO soldv1 VALUES(1,10),(4,40),(7,20);
SELECT * FROM soldv1 ORDER BY timestamp;
ALTER TABLE soldv1 ADD COLUMN items_sold_y INTEGER;
UPDATE soldv1 SET items_sold_y = 5 WHERE timestamp = 1;
INSERT INTO soldv1 VALUES(2,null,10),(5,null,3);
SELECT * FROM soldv1 ORDER BY timestamp;

, в результате чего первый запрос возвращает: -

* +1012 *enter image description here

и второй запрос возвращает: -

enter image description here

Однако, как уже говорилось, вышеприведенное не считается хорошим дизайном, поскольку схема является динамической.

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

Рассмотрим в качестве примера следующее: -

DROP TABLE IF EXISTS soldv2;
CREATE TABLE IF NOT EXISTS soldv2 (type TEXT, timestamp INTEGER, items_sold INTEGER, PRIMARY KEY(timestamp,type));
INSERT INTO soldv2 VALUES('x',1,10),('x',4,40),('x',7,20);
INSERT INTO soldv2 VALUES('y',1,5),('y',2,10),('y',5,3);
INSERT INTO soldv2 VALUES('z',1,15),('z',2,5),('z',9,25);
SELECT * FROM soldv2 ORDER BY timestamp;

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

Результат запроса: -

enter image description here

Или sqlite не тот инструмент вообще? И мне лучше использовать CSV или Excel?

SQLite является допустимым инструментом. То, что вы затем делаете с данными, может быть выполнено так же просто, как в Excel (возможно, проще) и, возможно, намного проще, чем попытка обработки данных в формате CSV.

Например, скажем, вы хотели, чтобы общее количество проданных товаров за метку времени и сколько типов было продано тогда: -

SELECT timestamp, count(items_sold) AS number_of_item_types_sold, sum(items_sold) AS total_sold FROM soldv2 GROUP by timestamp ORDER BY timestamp;

приведет к: -

enter image description here

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