You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prisma双字段分组后重复PlantName问题及日期处理需求

问题分析与修正方案

核心错误点

  1. 分组后未合并同工厂数据
    你当前按PlantName+OrderDate分组,同一个工厂的每日记录会生成独立分组结果。直接用map遍历分组时,每个分组都会输出一个带PlantName的对象,自然出现重复条目。

  2. 字段映射错误
    代码里写的PlantName: agg.Plant是错误的,分组字段是PlantName,应该改为agg.PlantName,否则会导致字段值异常。

  3. 未处理OrderDate的时间部分
    如果OrderDate包含时间戳,同日期不同时间的记录会被当成不同分组,必须先提取纯日期再进行分组。

修正后的代码

第一步:按纯日期+PlantName完成分组

如果使用ORM(如Prisma),直接在分组时用数据库函数提取日期部分;如果是纯JS处理,后续格式化时统一日期格式:

// 按PlantName和纯日期分组(数据库层面处理时间)
const ordersWithAggregations = db.Orders.groupBy({
  by: ['PlantName', db.fn.date(db.Orders.OrderDate)], // 提取OrderDate的纯日期部分
  where: {
    PlantName: { in: plantNames },
    OrderDate: { gte: fromDate, lte: toDate }
  },
  _sum: {
    TotalPrice: true
  },
  orderBy: { OrderDate: 'asc' }
});

// 合并同Plant的每日数据,避免重复PlantName
const plantDataMap = new Map();

ordersWithAggregations.forEach(agg => {
  const plantName = agg.PlantName;
  const formattedDate = format(new Date(agg.OrderDate)); // 确保日期格式统一
  const totalPrice = agg._sum.TotalPrice || 0;

  // 初始化Plant数据结构
  if (!plantDataMap.has(plantName)) {
    plantDataMap.set(plantName, {
      PlantName: plantName,
      data: []
    });
  }

  // 将当日数据追加到对应Plant的data数组
  plantDataMap.get(plantName).data.push({
    date: formattedDate,
    grandTotalPrice: totalPrice
  });
});

// 转换为目标格式数组
const result: IDataVisualize[] = Array.from(plantDataMap.values());

关键修正说明

  • 用Map聚合同Plant数据:借助Map的键唯一性,确保每个工厂只生成一个对象,所有日期的总和数据都放到该对象的data数组中。
  • 修正字段映射:将agg.Plant改为agg.PlantName,匹配分组时的字段名。
  • 统一日期格式:无论是数据库层面提取纯日期,还是代码里格式化,都要确保同一天的记录被归为同一组,避免因时间戳差异导致的分组错误。

内容的提问来源于stack exchange,提问作者Dan Hunex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:10:28