MySQL中分组查询获取组内时间最小的记录集合

需求

现有一需求,根据id/name/login_name/created_at字段查询结果后,需要将查询出来的记录根据id和name分组后,在组内选择时间created_at最小的那一个login_name

根据id/name分组之后,login_name会有多个,组内时间也会不同;组内id/name相同。

思路

SQL1中查询出全部记录,并且根据id和created_at拼接为新的字段k,在SQL2中过滤出符合条件的记录,并且根据id和created_at拼接为新的字段;最后在SQL3中,根据字段k去查询过滤出符合条件的记录。

1、原有SQL查询-SQL1

原有SQL查询出来全部结果,其中

select rs.id,rs.name,u.login_name,u.created_at
from t_remote_station rs 
left join t_user u on rs.id=u.station_id
and u.customer_type=1 and u.product_id=1
order by rs.id,u.created_at asc

结果如下(共有31条记录,其中有几个需要过滤):


共有31条数据

2、修改SQL-SQL2

select rs.id,rs.name,MIN(u.created_at) created_at
from t_remote_station rs left join t_user u on rs.id=u.station_id
and u.customer_type=1 and u.product_id=1 
group by rs.id,rs.name
分组之后获取24条数据

3、获取每组内时间最小的那条记录-SQL3(符合要求的SQL)

select a.id,a.name,a.login_name,a.created_at from (
select rs.id,rs.name,u.login_name,u.created_at,CONCAT(rs.id,u.created_at) as k
from t_remote_station rs 
left join t_user u on rs.id=u.station_id
and u.customer_type=1 and u.product_id=1
order by rs.id,u.created_at asc) a 
where a.k in (
select CONCAT(b.id,b.created_at) from (
select rs.id,rs.name,MIN(u.created_at) created_at
from t_remote_station rs left join t_user u on rs.id=u.station_id
and u.customer_type=1 and u.product_id=1 
group by rs.id,rs.name) b );
最后获取符合要求的24条数据

4、End

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容