分组 后获取创建时间 最新的一条


前言

按纬度统计 但按照数据最新时间作为有效数据进行统计。
例如:按今日的月份向前统计共计12个月的不同设备报警核实次数。核实表同一月份同一个设备报警可能被多次核实,但统计只取当前设备报警最后一次被核实作为有效次数。

一、实现思路

  1. 取到所有有效数据(设备当前报警最后一次核实的数据)
  2. 按照月份时间段筛选 统计个数

二、代码

代码如下(示例):

		List<FirePointVeriPO> all = firePointVeriDao.findAll();
        /**
         *  分组 后获取创建时间 最新的一条
         */
        Collection<FirePointVeriPO> collect = all.stream().collect(Collectors.toMap(
                FirePointVeriPO::getFirePointId,
                v -> v,
                (v1, v2) -> {
                    LocalDateTime dataTime = v1.getCreateTime();
                    LocalDateTime startDate1 = v2.getCreateTime();
                    if (dataTime == null || startDate1 == null) {
                        return dataTime != null ? v1 : v2; //拿到不为空的 ,都为空取后一条
                    }
                    return dataTime.isAfter(startDate1) || dataTime.isEqual(startDate1) ? v1 : v2;
                }
        )).values();
        //按月份筛选统计
        List<ChartResp.ChartData> list = Arrays.stream(last12Months).map(m -> {
            LocalDateTime start = startInit.minusMonths(-ArrayUtils.indexOf(last12Months, m));
            LocalDateTime end = endInit.minusMonths(-ArrayUtils.indexOf(last12Months, m));
            int value = (int) collect.stream()
                    .filter(c -> (c.getCreateTime().isEqual(start) || c.getCreateTime().isAfter(start)) && c.getCreateTime().equals(end) || c.getCreateTime().isBefore(end))
                    .count();
            return ChartResp.ChartData.builder().name(m).value(value).build();
        }).collect(Collectors.toList());

三、其他代码

2.1 获取当前时间月份向前推算11个月的起始日期

LocalDateTime now = LocalDateTime.now().minusMonths(11);
LocalDateTime startInit = LocalDateTime.of(LocalDate.from(now.with(TemporalAdjusters.firstDayOfMonth())), LocalTime.MIN);
LocalDateTime endInit = LocalDateTime.of(LocalDate.from(now.with(TemporalAdjusters.lastDayOfMonth())), LocalTime.MAX);

2.2 获取横坐标(当前月份向前推算11个月)

private static String[] getLast12Months() {
    String[] last12Months = new String[12];
    Calendar cal = Calendar.getInstance();
    //设置输入条件时间
    cal.setTime(new Date());
    
    cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + 1); //要先+1,才能把本月的算进去
    for (int i = 0; i < 12; i++) {
        cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - 1); //逐次往前推1个月
        last12Months[11 - i] = addZeroForNum(String.valueOf(cal.get(Calendar.MONTH) + 1), 2) + "月";
    }
    return last12Months;
}

private static String addZeroForNum(String str, int strLength) {
    int strLen = str.length();
    if (strLen < strLength) {
        while (strLen < strLength) {
            // sb.append(str).append("0");//右补0
            str = "0" + str// 左补0
            // sb.append(str).append("0");//右补0
            ;
            strLen = str.length();
        }
    }
    return str;
}

四、实现效果

截图当前时间为23年1月份
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr-Wanter

感谢大佬

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值