如何按 MySQL 中的最后一个重复项对记录进行分组?

Posted

技术标签:

【中文标题】如何按 MySQL 中的最后一个重复项对记录进行分组?【英文标题】:How to group records by last duplicates in MySQL? 【发布时间】:2019-05-12 12:59:49 【问题描述】:

我有一个包含用户登录信息的表。我想对 last 重复记录进行分组。例如:

+---+------------+-------------+-------------+------------------+
|   |     ip     |   platform  |   browser   |       date       |
+---+------------+-------------+-------------+------------------+
| 1 | 127.0.0.1  |   Windows   |   Chrome    | 2018-01-01 00:00 |
| 2 | 127.0.0.1  |   Windows   |   Chrome    | 2018-01-02 00:00 |
| 3 | 10.0.0.1   |   Linux     |   Firefox   | 2018-01-03 00:00 |
| 4 | 127.0.0.1  |   Windows   |   Chrome    | 2018-01-04 00:00 |
+---+------------+-------------+-------------+------------------+

将输出:

+-----+------------+-------------+-------------+-------------+
|     |     ip     |   platform  |   browser   | num_records |
+-----+------------+-------------+-------------+-------------+
| 1-2 | 127.0.0.1  |   Windows   |   Chrome    |      2      |
| 3   | 10.0.0.1   |   Linux     |   Firefox   |      1      |
| 4   | 127.0.0.1  |   Windows   |   Chrome    |      1      |
+-----+------------+-------------+-------------+-------------+

(为了简单起见,我发出了日期,应该有像id这样的日期范围)

请注意,ID 1,2,4 相同,但 1,24 由于时间轴的原因被单独分组(有另一条记录将它们分开)。

要查找重复项,我应该考虑以下列:ip, platform, browser。如果某些内容与这些列不同,则它不是重复的。

我能做到:

SELECT      ip, platform, browser, COUNT(1) AS num_records
FROM        users_logins
WHERE       user_id = 1
GROUP BY    ip, platform, browser

但这会在不考虑时间线的情况下对所有记录进行分组。

【问题讨论】:

如果有更早的时间重复怎么办? 你有主键吗? @Strawberry 是的,我有一个自动增量id 列。 【参考方案1】:

这是一个孤岛问题。在 mysql 8+ 中,您可以使用行号的差异:

select ip, platform, browser,
       count(*) as numrecords,
       min(id), max(id),
       min(date), max(date)
from (select t.*,
             row_number() over (order by date) as seqnum,
             row_number() over (partition by ip, platform, browser order by date) as seqnum_2
      from t
     ) t
group by ip, platform, browser, (seqnum - seqnum_2)
order by min(date) desc;

【讨论】:

感谢您的回答!我收到You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(order by date) as seqnum, row_number() over (partition by i' at line 6 有什么想法吗? @HTMHell 。 . . MariaDB 从 2016 年 4 月发布的 10.2.0 版本开始支持窗口函数。

以上是关于如何按 MySQL 中的最后一个重复项对记录进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

mysql:按用户获取最后一次对话记录[重复]

如何获取mysql重复项中的最后一条数据

mySql获取重复条目的最后记录[重复]

mySql获取重复条目的最后记录[重复]

如何合并 MySQL 表中的重复行

按第一项对嵌套列表进行排序——itemgetter 没有做到这一点