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;