数据统计类处理方案
图
针对MyBatis查询数据库,形成图表类的解决方案,例如每天活跃人数的折线图统计等,复杂场景统计通常会根据实际情况进行业务应用处理,而非使用数据库处理

日活跃统计(过滤、去重)

// 日活跃统计
@Override
public List<UserActiveCountRespVo> userActiveCount() {
    // 查询日活天数
    int day = 15;
    Date date = new Date();
    // 查询近期的活跃数据(全部)
    QueryWrapper<UserActive> wrapper = new QueryWrapper<>();
    wrapper.lambda().gt(UserActive::getCreateTime, DateUtil.offsetDay(date, -day));
    List<UserActive> userActiveList = userActiveMapper.selectList(wrapper);
    // 最后的结果数据
    List<UserActiveCountRespVo> list = new ArrayList<>();
    // 遍历处理日期
    SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd");
    for (int i = 0; i < day; i++) {
        // 处理的日期
        DateTime dateTime = DateUtil.offsetDay(date, -day + i + 1);
        // 日期格式化
        String format = simpleDate.format(dateTime);
        // 过滤数据
        // 起始时间
        DateTime beginOfDay = DateUtil.beginOfDay(dateTime);
        // 结束时间
        DateTime endOfDay = DateUtil.endOfDay(dateTime);
        // 过滤数据
        List<UserActive> filterList = userActiveList.stream().filter(
                c -> c.getCreateTime().after(beginOfDay) && c.getCreateTime().before(endOfDay)
        ).collect(Collectors.toList());
        // 去重
        ArrayList<UserActive> collect = filterList.stream().collect(
                Collectors.collectingAndThen(
                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(UserActive::getUserId))),
                        ArrayList::new
                )
        );
        UserActiveCountRespVo vo = new UserActiveCountRespVo();
        vo.setData(format);
        vo.setCount((long) collect.size());
        list.add(vo);
    }
    return list;
}