MySQL - выберите самую большую дату для каждой группы дат - PullRequest
1 голос
/ 08 октября 2019

У меня есть следующая таблица:

SELECT * FROM checkin;

+----+--------+---------------------+
| id | userid |    date_checked     |
+----+--------+---------------------+
| 1  |   15   | 2019-10-08 10:22:15 | 
| 2  |   15   | 2019-10-08 10:22:42 | 
| 3  |   15   | 2019-10-08 10:23:01 | 
| 4  |   40   | 2019-10-08 10:23:44 | 
| 5  |   15   | 2019-10-08 10:24:06 | 
| 6  |   15   | 2019-10-08 10:24:09 | 
| 7  |    3   | 2019-10-08 10:24:59 | 
+----+--------+---------------------+

Я хочу выбрать строки с самыми высокими датами date_checked для каждой группы последовательных равных идентификаторов пользователей. В этом примере я ожидал бы что-то вроде этого:

+----+--------+---------------------+
| id | userid |    date_checked     |
+----+--------+---------------------+
| 3  |   15   | 2019-10-08 10:23:01 | 
| 4  |   40   | 2019-10-08 10:23:44 | 
| 6  |   15   | 2019-10-08 10:24:09 | 
| 7  |    3   | 2019-10-08 10:24:59 | 
+----+--------+---------------------+

Пожалуйста, перед тем, как пометить как «дублированный из», обратите внимание, что: мне не нравится DISTINTC столбца идентификатора пользователя, один и тот же идентификатор пользователя может повторяться несколько разраз.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Это типичные пробелы и проблема острова. Предполагая, что вы используете MySQL 8.0, вы можете решить это с помощью ROW_NUMBER ():

SELECT
    MAX(id) id,
    userid,
    MAX(date_checked) date_checked
FROM (
     SELECT t.*,
        ROW_NUMBER() OVER(ORDER BY date_checked) rn1,
        ROW_NUMBER() OVER(PARTITION BY userid ORDER BY date_checked) rn2
    FROM checkin t
) x
GROUP BY rn1 - rn2, userid
0 голосов
/ 08 октября 2019

Попробуйте это: SELECT id, userid, MAX(date_checked) max_date_checked FROM checkin GROUP BY userid;

...