在工作中,遇到了这样的需求,需要根据某一个字段A分组查询,统计数量,同时还要查询另一个字段B,但是呢这个字段B在分组后的记录中存在不同的值。最开始不知道有聚合函数可以实现这一功能,在代码中进行了处理。后来,经老同事的提醒,得知了string_agg这个函数,便稍微查询整理了一下。
我们先新建一张表,插入一点数据,方便演示
CREATE TABLE public.user_info_test (
"name" varchar NULL,
hobby varchar **NULL**
);
INSERT INTO public.user_info_test ("name",hobby) VALUES
('张三','足球'),
('张三','羽毛球'),
('李四','羽毛球'),
('李四','篮球'),
('王五','乒乓球'),
('王五','乒乓球'),
('张三','足球');
简单的表结构,有name,hobby两个字段。类似的需求就是根据name,分组,同时查询这个人有哪些爱好。string_agg()最简单的使用就是传入拼接的字段和连接符,如下所示:
select name ,string_agg(hobby,'-') as hobbies from user_info_test group by name
name|hobbies |
—-±——–+
张三 |足球-羽毛球-足球|
李四 |羽毛球-篮球 |
王五 |乒乓球-乒乓球|
可以看到,每个人的多个hobby被拼接到了一起。但是存在重复的记录,可以用distinct
去重。
select name ,string_agg(distinct hobby,'-') as hobbies from user_info_test group by name
name|hobbies|
—-±——+
张三 |羽毛球-足球 |
李四 |篮球-羽毛球 |
王五 |乒乓球|
有的时候我们可能还需要对hobby字段进行排序,可以使用如下形式,默认是asc排序:
select name ,string_agg(distinct hobby,'-' order by hobby asc) as hobbies from user_info_test group by name
name|hobbies|
—-±——+
张三 |羽毛球-足球 |
李四 |篮球-羽毛球 |
王五 |乒乓球
select name ,string_agg(distinct hobby,'-' order by hobby desc) as hobbies from user_info_test group by name
name|hobbies|
—-±——+
张三 |足球-羽毛球 |
李四 |羽毛球-篮球 |
王五 |乒乓球
由于工作中使用的是pgsql,所以以上是pgSQL中string_agg函数的用法,很多情况下还是会用到mysql的,所以我查了一下mysql是否也有相关的函数,mysql果然没有让我失望,类似的函数叫做group_concat
下面演示mysql中group_concat的相关用法
select name ,group_concat(hobby) as hobbies from user_info_test group by name
select name ,group_concat(hobby separator '-' ) as hobbies from user_info_test group by name
select name ,group_concat(distinct hobby separator '-') as hobbies from user_info_test group by name
select name ,group_concat(distinct hobby order by hobby asc separator '-') as hobbies from user_info_test group by name
select name ,group_concat(distinct hobby order by hobby desc separator '-') as hobbies from user_info_test group by name
原文地址:https://blog.csdn.net/Qy1997/article/details/135442930
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_52692.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!