您当前的位置:首页 > 电脑百科 > 数据库 > 百科

用Stream实现mysql的groupBy, sum Case when 语法

时间:2022-09-05 14:55:23  来源:  作者:爱码僧

由于最近项目上进行了大升级,shardingsphere从3升级到了shardingsphere5.1.1,导致MyBatis中写的定制化的好多SQL语句报错:sytax error,很显然诸如case when这类的语法已经不支持了,没办法只能在内存中group by ,case when 后进行一个 sum 的操作。业务上就是统计状态字段出现的次数。

SQL语句的原型:

select company_id,
          business_date,
          SUM(CASE status WHEN 0 THEN 1 else 0 end) zeroCnt,
          SUM(CASE status WHEN 1 THEN 1 else 0 end) twoCnt,
          SUM(CASE status WHEN 2 THEN 1 else 0 end) thereCnt
 from table
 group by company_id, business_date

通过Stream实现

    @Test
    public void testStreamGroupBySum(){
        UserBO userBO = new UserBO(1000, "2022-09-02", 0);
        UserBO userBO1 = new UserBO(1000, "2022-09-02", 1);
        UserBO userBO2 = new UserBO(1000, "2022-09-03", 2);
        UserBO userBO3 = new UserBO(1000, "2022-09-03", 0);
        ArrayList<UserBO> list = new ArrayList<UserBO>();
        list.add(userBO);
        list.add(userBO1);
        list.add(userBO2);
        list.add(userBO3);

        List<UserStatistic> userStatistics = list.stream().collect(Collectors.groupingBy(UserBO::getAttnDate)).entrySet().stream().map(entry -> {

            UserStatistic userStatistic = new UserStatistic();

            if (!CollectionUtils.isEmpty(entry.getValue())) {
                userStatistic.setCompanyId(entry.getValue().get(0).getCompanyId());
            }

            userStatistic.setAttnDate(entry.getKey());

            Map<Integer, Long> map = entry.getValue().stream().collect(Collectors.groupingBy(UserBO::getStatus, Collectors.counting()));
            userStatistic.setNormalCnt(map.getOrDefault(UserStatusEnum.NORMAL.getKey(), 0L));
            userStatistic.setAbsenceCnt(map.getOrDefault(UserStatusEnum.ABSENCE.getKey(), 0L));
            userStatistic.setExpireCnt(map.getOrDefault(UserStatusEnum.EXPIRE.getKey(), 0L));

            return userStatistic;
        }).sorted().collect(Collectors.toList());
        System.out.println(JSON.toJSONString(userStatistics));
    }

测试结果:

[{"absenceCnt":0,"attnDate":"2022-09-03","companyId":1000,"expireCnt":1,"normalCnt":1},{"absenceCnt":1,"attnDate":"2022-09-02","companyId":1000,"expireCnt":0,"normalCnt":1}]

如果感觉对你有所帮助,烦请来个一键三联哦



Tags:   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
早高峰打“飞的”有多快?半小时车程仅需6分钟
横越珠江,掠过广东省博物馆、花城广场等地标性景观,向着广州塔飞去&hellip;&hellip;近日,小鹏汇天的eVTOL(电动垂直起降飞行器)旅航者X2首次飞跃广州CBD。跨江示范飞行中,半小时车...【详细内容】
2024-04-12  Search:   点击:(1)  评论:(0)  加入收藏
JavaScript的异步编程常见模式
在JavaScript中,异步编程是一种处理长时间运行操作(如网络请求或I/O操作)的常见方式。它允许程序在等待这些操作完成时继续执行其他任务,从而提高应用程序的响应性和性能。JavaS...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
Rust编程语言的内存安全与性能:如何平衡?
Rust编程语言自诞生以来,就以其独特的内存安全特性和高性能而备受瞩目。然而,如何在保证内存安全的同时,实现高效的性能,一直是Rust开发者们面临的挑战。本文将深入探讨Rust的内...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
数字人破解跨境直播难题,打造经济高效运营新路径
在数字化浪潮席卷全球,跨境直播蔚然成风之际,众多企业与品牌纷纷借此渠道掘金国际市场,直面全球消费者。然而,构建一支专业且高能的直播团队并非一日之功,它需耗费大量资源进行人...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
Meta确认5月发布Llama 3,参数量达1400亿
周二,在伦敦的一场活动上,Meta 确认计划在下个月初推出其 LLM 的最新版 Llama 3,这个模型是驱动生成式 AI 助手的核心技术。这一消息证实了《The Information》杂志周一发布的...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
ChatGPT 应用商店?可能是一个万能应用程序!
OpenAI 在去年 11 月召开了一次开发者大会,首席执行官 Sam Altman 希望软件制造商在 ChatGPT 之上进行进一步的构建。OpenAI 表示,它将很快推出一个市场,开发人员和非技术人员...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
社交网络与Web3:数字社交的演进
在数字化时代的浪潮下,社交网络已成为人们日常生活的重要组成部分。从早期的在线论坛到如今的社交媒体平台,社交网络已经成为人们交流、分享和获取信息的主要渠道。然而,随着区...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
速查微信聊天最频繁对象,情侣必备!
在如今数字化交流的时代,微信无疑是我们日常生活中使用最频繁的工具之一。无论是工作、学习还是娱乐,微信都陪伴在我们身边,成为我们沟通的重要桥梁。而在微信的众多功能中,聊天...【详细内容】
2024-04-12  Search:   点击:(1)  评论:(0)  加入收藏
女人在微信上给你发这两个字,其实是想你了
情感的表达需借助书信,那一份份缓慢穿越时空的纸张,承载着承诺与深情,往往能够维系一段白头偕老的姻缘。而如今,随着科技的进步,爱情已不再依赖书信这种传统的沟通方式。我们有了...【详细内容】
2024-04-12  Search:   点击:(2)  评论:(0)  加入收藏
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  Search:   点击:(1)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(5)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(14)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(14)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(7)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(15)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 &darr;select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(6)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(5)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(32)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, &#39;研发部(RD)&#39;, &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(20)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条