Запрос MySQL для добавления последних двух строк с равным значением «данные»

#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