Java对查询结果的分组统计的优化

本文探讨了一个需求,即统计某一产品近n天的每日销量和包裹数,以支持前端的数据可视化。初始代码中,由于大量数据导致查询耗时过长。通过取消无意义的复制操作、优化时间格式转换、并发处理分组和改进销量统计方法,成功减少了查询时间。优化后,性能显著提升,虽然最终可能结合Redis进一步优化,但初次查询速度的提升对用户体验至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

统计某一产品的近n天的每天的销量和包裹数量,用于前端实现数据可视化

初始代码

原始数据通过造假数据获取

基础类

// 保存查询结果集
@Data
public class DataGroupBO {
   
    /**
     * pms sku
     */
    private String pmsSku;
    /**
     * om_order_id
     */
    private String omsOrderId;
    /**
     * sku销售数量
     */
    private Integer productQuantity;
    /**
     * 付款时间
     */
    private Date payTime;
    /**
     * 包裹单号
     */
    private String packageCode;
    /**
     * 仓库code
     */
    private String warehouseCode;
}
//中转bo,用来临时存放将要处理的数据
@Data
public class SkuSalesCountBO {
   
    /**
     * om_order_id
     */
    private String omsOrderId;
    /**
     * sku销售数量
     */
    private Integer productQuantity;
    /**
     * 包裹单号
     */
    private String packageCode;
    /**
     * 付款时间
     */
    private Date payTime;
    /**
     * 付款日期
     */
    private String date;
}
//内层vo
@Data
public class OmsSalesCountVO implements Serializable {
   
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "销量")
    private Integer salesCount;
    @ApiModelProperty(value = "包裹数量")
    private Integer packageCount;
    @ApiModelProperty(value = "付款时间,精确到日期")
    private String date;
    @ApiModelProperty(value = "付款时间,精确到秒")
    private Date dateTime;
}
//外层vo
@Data
public class OmsSalesTrendVO implements Serializable {
   
    private static final long serialVersionUID = 1L;
    /**
     * sku
     */
    @ApiModelProperty(value = "sku")
    private String sku;
    /**
     * 仓库编码
     */
    @ApiModelProperty(value = "仓库编码")
    private String warehouseCode;
    /**
     * 销量和包裹数量信息
     */
    @ApiModelProperty(value = "销量和包裹数量信息")
    private List<OmsSalesCountVO> countList;
}

造假数据

  • 其中,一个产品对应多个订单,一个订单可以有多个包裹
  • 销量字段productQuantity是以订单号为维度的确定的,与包裹号无关
  • 原始数据中,包裹号是可以唯一定位的
  • 模拟90天,大约产生9k-90w条数据(包裹量)
	private void addData(List<DataGroupBO> list) {
   
        // 90天循环
        for (int i = 0 ; i < 90 ; i++ ) {
   
            DateTime dateTime = DateUtil.offsetDay(new Date(), i - 90);
            //每天随机单量100-1000
            int orderCount = (int) (Math.random() * 999) + 100;
            for (int j = 0; j < orderCount; j++) {
   
                //每单随机包数量1-10
                int packageCount = (int) (Math.random() * 9) + 1;
                //每单随机销量1-10
                int count = (int) (Math.random
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值