Я использую базу данных SQL для хранения некоторых людей, считающих результаты анализа видео. Таблицу count можно суммировать следующим образом:
rowid (auto increment int) | created_at (date) | type (int) | count_value (int)
----------------------------+-------------------------+---------------+-------------
Позже я хотел добавить некоторые атрибуты для обнаруженных людей, все еще используя обработку изображений. Я мог бы изменить таблицу counting , но для каждого добавленного атрибута мне пришлось бы вручную изменять таблицу counting . Я хотел динамическое решение. Была создана вторая таблица, которая называется attribute , что довольно просто.
rowid (auto increment int) | key (string) | value (string) | row_id_counting (int)
----------------------------+--------------------+-------------------+-------------
Например, если мой алгоритм обнаружит 30-летнего мужчину, в появятся следующие строкиподсчет и атрибутов таблиц:
COUNTING :
rowid | created_at | type | count_value
------+-------------------+------+-------------
150 | 2019.10.18 08:50 | 1 | 1
ATTRIBUTES :
rowid | key | value | row_id_counting
-------+-----------+----------+---------------
120 | "gender" | "M" | 150
121 | "age" | "30" | 150
Если когда-нибудь в моей подсчет таблице придется хранить данные другого типа (например, о кошках или транспортных средствах), яможно указать его в столбце type
, и мне не придется хранить бесполезные атрибуты для этих данных, поскольку атрибуты хранятся в другой таблице и создаются динамически.
Я также могу легко получить некоторые данные из подсчет с определенными атрибутами с использованием JOIN в моих запросах SQL.
Теперь я хочу суммировать все данные с одинаковыми атрибутами в час, чтобы создать некоторую статистику из моеготаблица подсчетаМое первое решение:
SELECT SUM(count_value), attr.key, attr.value, strftime('%Y-%m-%d %H:00:00',created_at, 'localtime') as timestr
FROM counting cnt
LEFT JOIN attributes attr ON cnt.rowid = attr.row_id_counting
WHERE datetime(created_at,'localtime') BETWEEN '2019-10-16 22:00:0.000000' AND '2019-10-17 22:00:00.000000'
AND cnt.type = 1
GROUP BY timestr,attr.key, attr.value
Сначала результаты выглядели многообещающими, этот запрос возвращал даже значение для подсчитываемых строк без атрибутов. Но простой набор данных может легко показать ограничения:
- Один 50-летний человек, неизвестный пол
- Один 20-летний мужчина
- Одна женщина, неизвестный возраст
- Один человек, неизвестный возраст и пол
Результаты:
SUM(count_value) key value timestr
1 (null) (null) 2019-10-18 10:00:00
1 age 20 2019-10-18 10:00:00
1 age 50 2019-10-18 10:00:00
1 gender F 2019-10-18 10:00:00
1 gender M 2019-10-18 10:00:00
Даже если я добавлю (нулевую) (нулевую) строку всуммы возрастных или гендерных атрибутов, я считаю только 3 человека вместо 4. Пропавшим человеком по возрастной сумме является женщина с неизвестным возрастом, а пропавшим по гендерной сумме - 50 лет с неизвестным полом.
Есть ли способ изменить этот запрос SQL, чтобы вместо него были следующие строки:
SUM(count_value) key value timestr
2 age (null) 2019-10-18 10:00:00
1 age 20 2019-10-18 10:00:00
1 age 50 2019-10-18 10:00:00
2 gender (null) 2019-10-18 10:00:00
1 gender F 2019-10-18 10:00:00
1 gender M 2019-10-18 10:00:00