如何在MariaDB分组查询中获取重复ext_id对应的最后一条id
如何在MariaDB分组查询中获取每组最后一条记录的id?
你只需要把原来查询中的s.id替换成MAX(s.id)就可以了——因为在你的数据里id是递增的,最大的id就对应分组里最后插入的那条记录。修改后的SQL语句如下:
SELECT s.ext_id, count(s.ext_id), MAX(s.id) AS last_id FROM sale_point AS s GROUP BY s.ext_id HAVING count(s.ext_id) > 1;
为什么这样修改?
原来的查询中,当你在GROUP BY后直接选择非聚合列s.id时,MariaDB(和MySQL)会返回分组中任意一条记录的id(在你的场景里刚好是第一条)。这是因为SQL标准其实不允许在GROUP BY中选择未被聚合或未包含在分组条件里的列,但MariaDB默认允许这种行为,会返回存储顺序里的第一条记录。
而使用MAX(s.id)聚合函数后,会明确返回每个ext_id分组中最大的id值,也就是你需要的最后一条记录的id。
示例验证
用你提供的测试数据:
+--------+------------+ | id | ext_id | +--------+------------+ | 376764 | 2065277658 | | 390836 | 2065277658 | +--------+------------+
执行修改后的查询,会得到如下结果:
+------------+-----------------+---------+ | ext_id | count(s.ext_id) | last_id | +------------+-----------------+---------+ | 2065277658 | 2 | 390836 | +------------+-----------------+---------+
完全符合你想要的结果。
额外说明
如果你的id不是自增的,而是需要根据其他字段(比如创建时间create_time)来判断"最后一条",可以调整聚合逻辑:
SELECT s.ext_id, count(s.ext_id), s.id AS last_id FROM sale_point AS s INNER JOIN ( SELECT ext_id, MAX(create_time) AS max_create_time FROM sale_point GROUP BY ext_id HAVING count(ext_id) > 1 ) AS t ON s.ext_id = t.ext_id AND s.create_time = t.max_create_time GROUP BY s.ext_id;
不过在你的场景里,用MAX(id)就足够解决问题了。
内容的提问来源于stack exchange,提问作者Вячеслав Чернышов
相关产品推荐
相关产品推荐

