需求

现有一需求,根据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条记录,其中有几个需要过滤):

6c3a4e1f4a43

共有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

6c3a4e1f4a43

分组之后获取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 );

6c3a4e1f4a43

最后获取符合要求的24条数据

4、End

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐