gpt4 book ai didi

mysql - 如何在 MySQL 中按最后重复项对记录进行分组?

转载 作者:行者123 更新时间:2023-11-29 06:31:18 24 4
gpt4 key购买 nike

我有一个表,其中保存有关用户登录的信息。我想对最后重复记录进行分组。例如:

+---+------------+-------------+-------------+------------------+
| | 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、平台、浏览器。如果某些内容与这些列不同,则它不是重复的。

我能做到:

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

但这会将所有记录分组,而不考虑时间线。

最佳答案

这是一个间隙和岛屿问题。在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;

关于mysql - 如何在 MySQL 中按最后重复项对记录进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56099483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com