【PgSQL】聚合函数string_agg

在工作中,遇到了这样的需求,需要根据某一个字段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

相关推荐

  1. PgSQL聚合函数string_agg

    2024-01-08 07:38:02       55 阅读
  2. PGSQL】date_trunc 函数

    2024-01-08 07:38:02       57 阅读
  3. Oracle—PLSQL函数

    2024-01-08 07:38:02       29 阅读
  4. MYSQL学习——聚合函数

    2024-01-08 07:38:02       49 阅读
  5. SQL中聚合函数

    2024-01-08 07:38:02       48 阅读
  6. SQLServer聚合函数

    2024-01-08 07:38:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-08 07:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-08 07:38:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-08 07:38:02       82 阅读
  4. Python语言-面向对象

    2024-01-08 07:38:02       91 阅读

热门阅读

  1. SQL安全:常见手段

    2024-01-08 07:38:02       61 阅读
  2. C++-构造与解析

    2024-01-08 07:38:02       57 阅读
  3. mysql的视图和连表查询案例

    2024-01-08 07:38:02       56 阅读
  4. Chunjun纯钧(Flinkx)同步任务开发通用配置参数详解

    2024-01-08 07:38:02       170 阅读
  5. LeetCode每日一题 | 2397. 被列覆盖的最多行数

    2024-01-08 07:38:02       58 阅读
  6. Linux-rsync 服务器客户端模式同步

    2024-01-08 07:38:02       56 阅读
  7. SpringBoot-Dubbo-Zookeeper

    2024-01-08 07:38:02       60 阅读
  8. Python代码篇-小白必会(猜数字游戏)

    2024-01-08 07:38:02       56 阅读
  9. php加减乘除函数

    2024-01-08 07:38:02       64 阅读