首页 > 解决方案 > 在对另一列求和时选择具有最小日期的行

问题描述

我在 MySQL 中有下表:

在此处输入图像描述

我想获取count列的总和,但到期日期应显示为 null 或带有group by package_id.

我目前有以下查询:

select mt.id, mt.package_id, sum(mt.count), mt.expiry_date
from my_table mt left join my_table mt2 on mt.id = mt2.id and mt.expiry_date < mt2.expiry_date
group by mt.package_id;

它给出了以下结果:

在此处输入图像描述

我所需的结果应该2在第一行中作为 id 而不是1并且expiry_date应该是最小值,即2010-01-01 00:00:00

在此处输入图像描述

标签: mysqlgroup-by

解决方案


将表连接到计算总数并返回最小日期的查询:

select m.id, m.package_id, t.total, m.expiry_date
from my_table m
inner join (
  select package_id, 
         sum(count) total, 
         min(expiry_date) expiry_date
  from my_table
  group by package_id
) t on t.package_id = m.package_id and t.expiry_date <=> m.expiry_date

我在子句中使用NULL-safe equal operator <=>for以防万一 min是.expiry_dateONexpiry_datenull

演示
结果:

> id | package_id | total | expiry_date
> -: | ---------: | ----: | :----------
>  2 |          3 |    20 | 2010-01-01 
>  3 |          4 |    40 | 2011-01-01 

推荐阅读