PostgreSQL 实现多行数据与一条数据的互相转换

遇到一个场景是要把分组后的某个字段的多行数据组装成一个列表,开始我的做法是先查出全部数据,再遍历组装成一个 {key: list} 的结构来使用。但这样就比较繁琐,所以寻找了一种更加简便的做法。

补充:如何把一个数组内的内容展开成多行,方便做 group by 去统计数组中元素的个数。(见场景三)

使用

以下表为例:

classgendername
1MLiLei
1FHanMM
1MJim
2FKate
2MPeter

场景一

根据需求希望输出以下数据:

classnames
1LiLei,HanMM,Jim
2Kate,Peter

使用 string_agg 指定分隔符把某个字段的所有行拼接成字符串:

SELECT class, string_agg(name, ',') AS names FROM students GROUP BY class;

如果想 names 是以数组形式输出可以使用 array_agg :

SELECT class, array_agg(name) AS names FROM students GROUP BY class;

SQLAlchemy 下可以这样使用:

db.session.query(
    Students.class,
    func.string_agg(Students.name, ',').label('names')
).group_by(
    Students.class
).all()
db.session.query(
    Students.class,
    func.array_agg(Students.name).label('names')
).group_by(
    Students.class
).all()

场景二

另外一种常见需求,如下所示:

classcount_mcount_f
121
211

可以使用以下语句:

SELECT class
,SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS count_m
,SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS count_f
FROM students
GROUP BY class;

场景三(unnest 将数组展开成多条记录)

以下表为例:

postcategory
post_1{Python,SQL,Redis}
post_2{Python,Kafka}
post_3{SQL}

展开数组:

SELECT unnest(category) AS cate FROM table_name;

输出:

cate
Python
SQL
Redis
Python
Kafka
SQL

统计各个分类的个数:

SELECT unnest(category) AS cate, count(*) AS cate_count 
FROM table_name 
GROUP BY cate;

输出:

catecate_count
Kafka1
SQL2
Python2
Redis1
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值