#mysql #sql
#mysql #sql
Вопрос:
У меня есть таблица MySQL со столбцами user_id, действия и даты(формат метки времени).
user_id |action |date 1234 |update |2011-10-18 1234 |transfer |2011-10-22 1235 |log in |2011-11-15 1235 |update |2011-11-16 1235 |log out |2011-11-29 1236 |log in |2021-11-29
Чего я хочу добиться, так это увидеть количество дней между двумя последними действиями каждого идентификатора пользователя. Если для какого-либо пользователя существует только одно действие, верните количество дней с даты действия до сегодняшнего дня. Результат должен быть:
user_id |num_days 1234 |4 1235 |13 1236 |3
Надеюсь, в этом есть смысл, любая помощь будет оценена по достоинству. Я просмотрел здесь все соответствующие темы.
Комментарии:
1. Что вы пытались решить сами? Вы (пытались) написать инструкцию SQL? Что это было? откуда ты взялся, пытаясь решить эту проблему ?
2. Не порть свой вопрос.
Ответ №1:
Вы можете использовать само- join
:
select a1.user_id, abs(datediff(a1.m, max(case when a2.date is null then date(now()) else a2.date end))) num_days from (select a.user_id, max(a.date) m from actions a group by a.user_id) a1 left join actions a2 on a1.user_id = a2.user_id and a2.date lt; a1.m group by a1.user_id, a1.m
Выход:
идентификатор пользователя | число дней |
---|---|
1234 | 4 |
1235 | 13 |
1236 | 3 |
Комментарии:
1. это выводит только записи для идентификаторов пользователей 1234 и 1235
2. да, он не возвращает значение для одного действия, как я уже сказал
3. @Luuk Ах да, я не видел редактирования операции. Обновил сообщение.
Ответ №2:
самостоятельное присоединение, см. Ответ от Ajax1234 с некоторыми изменениями:
SELECT u1.user_id, u1.`date`, COALESCE(u2.`date`, current_date()) D, DATEDIFF(COALESCE(u2.`date`, current_date()), u1.`date`) num_days FROM actions u1 LEFT JOIN actions u2 on u2.user_id=u1.user_id and u2.`date`lt;u1.`date`;
выход:
идентификатор пользователя | число дней |
---|---|
1234 | 4 |
1235 | 13 |
1236 | 3 |