mysql分组排序取第一条数据

需求:

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

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. 使用 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;
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值