需求:

sql 根据某一个字段分组,然后组内排序,最后每组取排序后的第一条数据

1 手动分组排序,取分组第一条

1.1 先使用(分组字段+排序字段)排序

相当于实现了分组和排序,只是没有根据分组字段聚合,此时每个分组的第一条数据就是我们需要的目标数据。

1.2 再按分组字段分组,取第一条即可

实例如下:

with 
t_picture as(
 SELECT npi_product_id,is_default_one,update_time, uri FROM datahub_product_attachment where type=1 ORDER BY npi_product_id,is_default_one DESC,update_time DESC
)
SELECT npi_product_id, (ARRAY_AGG(uri))[1] as uri FROM t_picture  group by npi_product_id

必须在分组前排序,分组后排序是对分组字段和聚合字段排序。

2. 使用现成函数

row_number() over(partition by field_1,field_2 order by field_a desc,field_b desc )
此函数会根据 partition by 后字段分组,再根据 order by 后字段进行组内排序,最后,生成一个排序字段,实列如下:

with t_marked as(
select 
	row_number() 
	over(partition by dpa.npi_product_id order by dpa.is_default_one desc,dpa.update_time desc ) as group_idx
	,dpa.*   
	from datahub_product_attachment as dpa where dpa.type = 1
)
select * from t_marked where group_idx=1;

mySQL、postgreSQL 中都能使用这个函数。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐