Установить статус на основе разницы дат

Это моя входная таблица (таблица игроков) с идентификатором игрока и датами его игры, я хочу, чтобы это сверялось с таблицей вех, в которой есть подробная информация о том, когда игрок достиг своих вех. Я хочу сравнить таблицу вех с таблицей игроков, чтобы узнать, играли ли они в течение 60 дней с даты вехи.

  • если они не играли, они являются 60-дневными сбрасывателями, но если они вернулись через 60 дней, то их статус - вернувшиеся.
  • Если они вообще не вернулись обратно, то они 60-дневный сбрасыватель
  • Если они играли в течение 60 дней после контрольной даты, то они являются активными игроками.

стол игрока

идентификатор игрока date_played 1 10.01.2022 1 11.01.2022 1 12.01.2022 1 13.01.2022 1 13.05.2022 1 14.05.2022 1 15.05.2022 2 15.01.2022 2 15.02.2022 3 15.08.2022 4 05.01.2022 4 05.05.2022

таблица вех

player_id веха 1 13.01.2022 2 15.02.2022 3 15.08.2022 4 05.01.2022

Мой вывод

player_id веха_дата churn_status player_status 1 13.01.2022 60-дневный сбой Возвращающийся 2 15.02.2022 60-дневный сбой Взбивалка 3 15.08.2022 60-дневный сбой Взбивалка 4 05.01.2022 Активный игрок Возвращающийся

Как я могу достичь этого

На такой вопрос намного легче ответить с помощью правильной схемы, например SHOW CREATE TABLE. То, что у вас есть значения в формате M/D/YYYY, безусловно, выделяется, поскольку MySQL имеет тенденцию соответствовать стилю YYYY-MM-DD ISO.

tadman 14.04.2023 19:27

Откуда вывод для игрока 4? Их нет на входе.

Barmar 14.04.2023 19:39

веха_дата + 60 дней

Yash 14.04.2023 19:44

теперь я вижу, что в вашем последнем пуле вы говорите «в течение», так что это не совсем 60 дней.

Barmar 14.04.2023 19:53

глядя на ваши данные, я не понимаю, почему игрок 4 является «активным игроком»?

ysth 14.04.2023 21:11
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
5
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте левое соединение для сопоставления игр в течение 60 дней и после 60 дней.

SELECT m.player_id, m.milestone_date, 
    IF(MAX(c.player_id IS NULL), '60 day churner', 'Active player') AS churn_status, 
    IF(MAX(r.player_id IS NULL), 'churner', 'returner') AS player_status
FROM milestone AS m
LEFT JOIN player AS c ON c.player_id = m.player_id AND c.date_played > m.milestone_date AND c.date_played <= DATE_ADD(m.milestone_date, INTERVAL 60 DAY)
LEFT JOIN player AS r ON c.player_id = m.player_id AND c.date_played > DATE_ADD(m.milestone_date, INTERVAL 60 DAY)
GROUP BY m.player_id

Это соединяется с player дважды. Первое соединение получает все строки, в которых воспроизведение происходит между датой вехи и 60 днями позже. Второе соединение получает все строки, в которых происходит воспроизведение через 60 дней.

Если нет совпадений ни для одного из отношений дат, это соединение вернет строку, в которой все столбцы в player равны NULL. Условия IF() проверяют, содержит ли каждое соединение эти нулевые значения, и дают соответствующий результат в этом столбце.

можете ли вы объяснить запрос, пожалуйста

Yash 14.04.2023 20:24

Я добавил объяснение, а также исправил некоторые проблемы.

Barmar 14.04.2023 21:27
Ответ принят как подходящий

Похоже, вас интересует только категоризация на основе строк игроков (странное название таблицы, поскольку она, похоже, представляет игры, а не игроков), датированные после даты вехи.

Это довольно просто (непроверено):

select m.player_id, m.milestone_date,
    case
        when min(p.date_played) <= m.milestone_date + interval 60 day then 'Active player'
        else '60 day churner'
    end churn_status,
    case
        when min(p.date_played) is not null then 'returner'
        else 'churner'
    end player_status
from milestone m
left join player p on p.player_id=m.player_id and p.date_played > m.milestone_date
group by m.player_id

Это находит минимальную дату воспроизведения (если есть) для строк игроков после контрольной даты для каждого игрока и использует ее для определения статусов.

статус игрока возвращается, если он играет в течение 60 дней после контрольной даты.

Yash 14.04.2023 21:07

<= 60 для активного

Yash 14.04.2023 21:07

отредактировано для этого.

ysth 14.04.2023 21:09

и исправил ошибку

ysth 14.04.2023 21:12

Не могли бы вы объяснить свои заявления о случаях, почему MIN?

Yash 14.04.2023 23:01

Как изменить условие, если я хочу сократить 60-дневное окно до 7-14 дней? Ушедшие после достижения вехи за 7-14 дней

Yash 14.04.2023 23:10

min, потому что я присоединяюсь к любым записям игроков для каждого идентификатора игрока вехи и возвращаю одну строку для каждого идентификатора игрока и проверяю минимальную дату воспроизведения, чтобы определить статусы, используя регистр

ysth 15.04.2023 00:56

не уверен, что означает 7-14 дней; игнорировать любые строки менее чем через 7 дней после вехи? если не игнорировать их, то что с ними делать?

ysth 15.04.2023 00:57

Другие вопросы по теме