针对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;
}