如何用Prisma Client计算两年用电量差值并获取排序前10项?
解决方案
你可以在获取到两年的统计数据后,通过JavaScript的数组和对象操作完成匹配、差值计算、排序和筛选,具体实现如下:
1. 转换统计数据为便于查找的结构
把2021年的统计结果转换成以apartment_id为键的映射,快速通过公寓ID定位对应用电量总和:
// 用Map存储2021年各公寓的用电量总和,处理_sum为null的情况 const consumption2021Map = new Map( consumption2021.map(item => [ item.apartment_id, item._sum.consumption || 0 ]) );
2. 计算差值并筛选排序
遍历2022年的统计数据,匹配对应公寓的2021年数据,计算差值后排序取前10:
const consumptionDiff = consumption2022 .map(item => { const year2021Sum = consumption2021Map.get(item.apartment_id) || 0; const year2022Sum = item._sum.consumption || 0; return { apartment_id: item.apartment_id, 2021_consumption: year2021Sum, 2022_consumption: year2022Sum, difference: year2022Sum - year2021Sum // 2022相对2021的用电量差值 }; }) // 过滤掉两年都无有效数据的项(可选) .filter(item => item.2021_consumption > 0 || item.2022_consumption > 0) // 按差值降序排序(差值大的在前),升序则改为a.difference - b.difference .sort((a, b) => b.difference - a.difference) // 取排序后的前10项 .slice(0, 10);
额外说明
- 空值处理:如果某公寓在对应年份无符合条件的记录,
_sum.consumption会返回null,用|| 0转为0避免计算报错。 - 排序调整:若需要按差值绝对值排序,可将排序逻辑改为
Math.abs(b.difference) - Math.abs(a.difference)。
内容的提问来源于stack exchange,提问作者daeb2a
相关产品推荐
相关产品推荐

