Я пытаюсь разработать небольшой инструмент отчетности (с SQLite Backend). Я лучше всего могу описать этот инструмент как «транзакцию». То, что я пытаюсь сделать, это отслеживать «транзакции» от еженедельного извлечения данных:
- «новый» (или добавить) - ресурс является новым для моего приложения, так как мое приложение, возможно, не отслеживало этот ресурс раньше, так как его не видели через выдержки.
- «обновить» (или нажать) - этот ресурс используется в последнее время, срок хранения обновлений составляет еще одну неделю.
- «удалить» (или удалить) - этот элемент не использовался со времени последнего отчета (необязательно, но было бы неплохо иметь график для отображения изменений спроса на ресурсы по неделям).
Все, что у меня есть, - это еженедельное извлечение данных (простой файл с разделителями каналов), поступающее из устаревшей системы архивирования / управления записями, которую я не могу контролировать.
Каждая строка может быть переработана в основном так:
resource_id | resource info | customer_id | customer_info
Образец данных:
10| Title X | 1 | Bob
11| Another title | 1 | Bob
10| Title X | 2 | Alice
Цель состоит в том, чтобы упростить составление отчетов о ресурсах, которые не использовались в течение X месяцев (на основе последнего попадания). Существует период хранения, когда ресурсы сохраняются для удобства доступа, если они популярны. Ресурс, который не использовался в течение 18 месяцев, отмечен для долгосрочного архивирования в другом месте.
Это должно быть общей проблемой. Хотите знать, существует ли универсальный алгоритм для определения того, что нового / такого же / удаленного между наборами данных (дБ по сравнению с последним извлечением)?
В любом случае, если вы храните обновления в бэкэнде SQLite, вы можете превратить еженедельное обновление в новую таблицу и сравнить ее с архивированными данными с запросами, прежде чем объединять их.
Пример использования SQL для поиска новых дополнений в таблице: /programming/2077807/sql-query-to-return-differences-between-two-tables
Если в поле вашей БД хранится дата транзакции, вы можете просто запросить всех пользователей, у которых были транзакции за последние 18 месяцев. Тогда в архиве просто полная БД. Кроме того, вы можете запросить всех пользователей, которые не имеют, извлечь их данные, а затем отбросить их. Обновления - это просто строки с отметками времени на этой неделе.
источник
Vector
.Альтернативная идея:
Разобрать ваш список транзакций в какую-то структуру данных, например массив. (В C ++, думаю
Vector
, и в JavaArrayList
.)Выполните запрос в своем бэкэнде SQL, например,
SELECT DISTINCT customer_id FROM Transactions ORDER BY customer_id
и упакуйте отсортированные отдельные идентификаторы клиентов в наборold
. Если вы делаете то же самое сWHERE
предложением, разделяющим старые и новые транзакции, вы можете пропустить шаг 3.Получите уникальные идентификаторы клиентов из новых обновлений в отдельной структуре данных в отсортированном порядке. Есть пара структур данных, которые вы можете использовать, чтобы получить в структуру данных
new
. Сортировка вставки в двойной связанный список очень проста, но использование промежуточной хеш-таблицы будет работать близко к линейному времени, или, если вы все равно сортируете исходный массив, получить набор из этого легко.Возьмите разницу
new
-old
используйте стандартную библиотеку вашего любимого языка. Ваш любимый язык имеет этот алгоритм в своей стандартной библиотеке?Другие вещи, которые вы хотите сделать, это определенно SQL-запросы после обновления базы данных транзакций.
Примечание на шаге 3: рассмотрите характер ваших данных. Предположим, что в вашем текстовом файле перечислены заказы в хронологическом порядке, и в обычную неделю есть много новых клиентов, которые получают новые
customer_id
в порядке возрастания. Предположим, что большинство других заказов поступает от небольшого числа постоянных постоянных клиентов с меньшимcustomer_id
. Тогда ваши входы уже в основном отсортированы. Сортировка вставки, в которой вы пытаетесь вставить низкийcustomer_id
в начале двойного связанного списка и высокийcustomer_id
в конце, в этой ситуации будет хорошо работать на практике.источник
Как я понял из вашего вопроса, у вас действительно есть resource_id (+ info) и «список» клиентов (id + info).
Таким образом, вы можете легко хранить список клиентов для каждого ресурса и проверять последний узел в каждом списке на ресурсе (чтобы узнать время последней операции; вам просто нужно добавить поле даты для вашего клиента в коде)
Я не знаком с SQL, поэтому я привожу свой пример с
HashMap
и List, но я уверен, что это та же идея:HashMap <Resource, List<Customer>>
когдаResource
должен содержать resourceID в качестве ключа иCustomer
должен содержать идентификатор клиента, информацию и дату операции.С этой идеей вы можете легко узнать время последней операции и можете изменить любой ресурс (добавить \ удалить ресурс \ клиент).
источник
Если вы используете базу данных SqLite, если вы добавите дату пакета также в качестве столбца таблицы,
было бы довольно просто использовать SQL, чтобы получить ресурсы, не использовавшиеся за последние X дней
Я не проверял SQL, но он должен дать вам представление
источник
Из исходного поста звучит так, как будто у загружаемых данных нет поля для указания даты / времени транзакции, и я предполагаю, что файл принимается часто по расписанию, например ежедневно, ежечасно и т. Д.
Я бы справился с этим, добавив столбец отметки времени SQL, который либо генерируется автоматически на уровне базы данных, либо с помощью кода, который извлекает данные и вставляет их в базу данных. Затем вы помещаете индекс в этот столбец отметки времени и покончите с этим. Пусть механизм БД сделает свою работу эффективной, чтобы ответить на вопрос «сколько транзакций не произошло с этого времени» или «сколько между этим временем и тем временем».
Затем вы планируете задание для запроса и рассчитываете различия, по которым вы хотите отчитаться. Транзакции, которые являются «новыми», - это транзакции, которые не имеют записей в БД до даты, которую вы запрашиваете «новые с тех пор». Старые записи - это те, которые не имеют транзакций с даты закрытия.
источник
Разве это не то, для чего нужны HashTables? Если все, что вы хотите сделать, это вести учет того, какие ресурсы использовались в последние месяцы, и удалять ресурсы, к которым не обращались в течение последних 18 месяцев, тогда вы можете использовать HashTable, где Key - это resource_id, а значение - это дата последнего доступа.
Для архивирования записей> 18 месяцев вы можете просмотреть все записи в хэш-таблице и просто удалить (или переместить) эти конкретные записи. (вы можете делать это еженедельно, когда приходит отчет)
источник