MySQL-为每个日期组选择最大日期

时间:2019-10-08 19:34:46

标签: mysql sql gaps-and-islands

我有下表:

SELECT * FROM签到;

+----+--------+---------------------+
| 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 | 
+----+--------+---------------------+

我想为每组连续的相等用户ID选择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 | 
+----+--------+---------------------+

请在标记为“重复的”之前,请注意:我不喜欢userid列的DISTINTC,同一用户id可以重复多次。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

这是一个典型的差距和孤岛问题。假设您使用的是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

答案 1 :(得分:0)

尝试以下操作:SELECT id, userid, MAX(date_checked) max_date_checked FROM checkin GROUP BY userid;