MySQL中如何计算指定日期范围下各companyAccountId分组最后一行的字段总和
实现方案
方案1:MySQL 8.0+ 支持窗口函数版本(推荐)
核心逻辑是用ROW_NUMBER()窗口函数给每个企业账户的记录按时间倒序、id倒序排序,取每个组排名第一的最新记录后聚合求和。
SELECT SUM(totalVan) AS totalVanSum, SUM(totalBike) AS totalBikeSum FROM ( SELECT companyAccountId, totalVan, totalBike, ROW_NUMBER() OVER ( PARTITION BY companyAccountId ORDER BY `date` DESC, id DESC ) AS row_num FROM vehicle_assignment_history -- 替换为你实际的查询日期范围 WHERE `date` BETWEEN '2021-11-11 00:00:00' AND '2021-11-13 23:59:59' ) t WHERE row_num = 1;
方案2:MySQL 5.x 低版本兼容写法
通过子查询先拿到每个企业账户在指定日期范围内的最新记录id,再关联原表取字段求和。
SELECT SUM(v.totalVan) AS totalVanSum, SUM(v.totalBike) AS totalBikeSum FROM vehicle_assignment_history v INNER JOIN ( SELECT companyAccountId, MAX(id) AS latest_id FROM vehicle_assignment_history WHERE `date` BETWEEN '2021-11-11 00:00:00' AND '2021-11-13 23:59:59' GROUP BY companyAccountId ) t ON v.id = t.latest_id;
说明
- 表中
id为自增主键,同日期下id越大代表记录越新,所以排序规则用date DESC, id DESC可以保证拿到每个企业的最新记录,如果你有其他判断最新记录的规则可以自行调整排序逻辑。 - 日期过滤条件需要注意边界值,比如查询到2021-11-13的话,建议写
<= '2021-11-13 23:59:59'避免漏掉13号当天非0点的记录。 - 替换代码中的日期范围即可得到对应结果,和你给出的示例完全匹配。
内容的提问来源于stack exchange,提问作者Akash Kumar Verma
相关产品推荐
相关产品推荐

