取出含有分组最大值的行

这是一个通用的问题,很多业务场景下都存在,例如取出价格最贵的那个商品,取出最新的价格、等等

 

这类问题可以归为,如何将分组中最大值所在的行取出来

 

假设我们有一张表存储着”供应商ID_商品ID_采购价格_采购时间“四列信息,其中供应商ID_商品ID为联合主键

要求:对于某个商品,取出最近一次采购的价格?

 

错误作法:

select supplier_id , product_id , last_price ,  max(last_time) 
from table 
where product_id = 12345 group by product_id

 错误原因:存在group by子句时,在select列表中出现的列只能是group by子句中提到的列,或者是使用了聚集函数的列,所以这句SQL中取到的supplier_id和last_price都可能是错的

 

 

正确作法:

select  t1.supplier_id ,  t1.product_id ,  t1.last_price , t1.last_time
from table t1
where t1. product_id = 123456 and 
            t1.last_time = ( select max(t2.last_time) from table t2 where t1.product_id = t2.product_id)

 

或者:

select  t1.supplier_id ,  t1.product_id ,  t1.last_price , t1.last_time
from table t1
left join table t2
on t1.product_id = t2.product_id and t1.last_time < t2.last_time
where t2.product_id is null;
 

 

再或者:

select  t1.supplier_id ,  t1.product_id ,  t1.last_price , t1.last_time
from table t1
join (
    select product_id , max(last_time) max_last_time
    from table
    group by product_id ) as t2
on t1.product_id = t2.product_id and t1.last_time = t2.max_last_time;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值