mysql分组排序取第一条数据

需求:

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

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

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

3. postgreSQL 现成函数

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;