Узнайте последнее состояние активности пользователей, чья активность менялась за каждый день
select User_ID, New_Status, DATE_FORMAT(DATETIME, '%Y-%m-%d')
from activity_table
where not exists
(
select 1
from activity_table at
where at.User_ID = activity_table.User_ID and
DATE_FORMAT(at.DATETIME, '%Y-%m-%d') = DATE_FORMAT(activity_table.DATETIME, '%Y-%m-%d') and
at.DATETIME > activity_table.DATETIME
)
order by DATE_FORMAT(activity_table.DATETIME, '%Y-%m-%d');
Это еще не решение, но очень полезная информация перед решением. Обратите внимание, что здесь еще не все даты охвачены, и значения являются отдельными записями, точнее их последними значениями на каждый день, упорядоченными по дате.
Давайте получим агрегированные числа
Используя запрос выше как подвыбор и наложение его на table
, вы можете group by DATETIME
и выполнить select sum(new_Status) as activity, count(*) total, DATETIME
, чтобы вы знали, что activity - (total - activity)
- это разница по сравнению с предыдущим днем.
Зная дельту для каждого дня, присутствующего в результате
В предыдущем разделе мы видели, как можно вычислить дельту. Если весь запрос в предыдущем разделе является псевдонимом, вы можете самостоятельно присоединиться к нему, используя левое соединение, с парами (предыдущая дата, текущая дата), по-прежнему сохраняя пропуски дат, но пока не беспокоясь об этом. В случае первого свидания его activity
является дельтой. Для последующих записей добавление дельты предыдущего дня к их дельте дает нужный вам результат. Для этого вы можете использовать рекурсивный запрос, поддерживаемый MySQL 8, или, альтернативно, вы можете просто иметь подзапрос, который суммирует дельту предыдущих дней (с особым вниманием к первой дате, как описано ранее) и добавляя дельта текущей даты дает нужный нам результат.
Заполнить пробелы
Предыдущий раздел уже отлично работал бы (предполагая отсутствие проблем с целостностью), предполагая, что в каждый день происходили изменения активности , но мы не будем продолжать с предположением. Здесь мы знаем, что цифры верны для каждой даты, где фигура присутствует, и нам нужно будет просто добавить отсутствующие даты в результат. Если результаты правильно упорядочены, как и должно быть, то можно использовать курсор и l oop результаты. По каждой записи после первой мы можем определить пропущенные даты. Может быть 0 таких дат между двумя последовательными датами или более. Что мы знаем о пробелах, так это то, что их значения точно такие же, как в предыдущей записи, в которой есть данные. Если в указанную дату не было изменений активности, то количество активных пользователей точно такое же, как и в предыдущий день. Используя некоторую структуру, например таблицу, вы можете генерировать результаты, которые вы получаете, используя знания, описанные здесь.
Решение возможных проблем целостности
Существует несколько возможностей для таких проблем:
Во-первых, элемент данных мог существовать до того, как начали появляться записи этой таблицы.
Во-вторых, ошибки или любые другие причины могли сделать паузу в создании записей для этой таблицы действий.
В-третьих, добавление пользователя вызывает или не обязательно приводит к изменению активности, поскольку его возникновение делает его предыдущее состояние активности неопределенным и подчиняется человеческим стандартам, которые могут меняться со временем.
Четвертый удаление пользователя создает или не обязательно генерирует изменение активности, поскольку его вытеснение из существования делает текущее состояние активности неопределенным и подчиняется человеческим стандартам, которые могут меняться со временем.
В-пятых, существует бесконечность других вопросов, которые ми Это может вызвать проблемы с целостностью данных.
Чтобы справиться с ними, вам потребуется всесторонне проанализировать все, что вы можете из исходного кода и истории проекта, включая записи в базе данных, журналы и доступную человеку информацию для обнаружения таких аномалий. время, когда они были эффективными, и выясните, каково их решение, если они существуют.
РЕДАКТИРОВАТЬ
Тем временем я думал о возможности пользователя, который был активен в начале день будет деактивирован, а затем снова активирован к концу дня. Аналогичным образом, неактивный пользователь в течение дня может быть активирован, а затем окончательно деактивирован к концу дня. Для пользователей, у которых в начале дня было больше, чем активация, нам нужно сравнить их статус активности в начале и в конце дня, чтобы выяснить, в чем разница.