postgresql中如何把列中的每一行数据变成列的标题

PostgreSQL 18 新功能:虚拟生成列 PostgreSQL 18将引入虚拟生成列功能,这是继存储生成列后的又一重要特性。虚拟生成列在查询时动态计算,不占用存储空间,适用于轻量级表达式;而存储生成列则持久化在磁盘上,可被索引。该功能借鉴了Excel的反应式编程思想,通过定义源列和派生列的关系,简化数据库维护工作。实际应用中,虚拟生成列可用于多语言全文搜索等场景,通过不同文本配置生成多个tsvector列并分别建立索引,提升查询效率。这一特性将SQL从命令式编程转向更具声明性的风格,减少重复代码,使数据库设计更加简洁高效。 阅读详情

测试表

CREATE TABLE public.benefits (
	id int4 NOT NULL,
	workplace varchar(255) NULL,
	province varchar(255) NULL,
	benefits int4 NULL,
	CONSTRAINT offer_benefits_pkey PRIMARY KEY (id)
);
INSERT INTO public.benefits
(id, workplace, province, benefits)
VALUES(1, '合肥', '合肥', 0);
INSERT INTO public.benefits
(id, workplace, province, benefits)
VALUES(2, '合肥', '上海', 1000);
INSERT INTO public.benefits
(id, workplace, province, benefits)
VALUES(3, '合肥', '北京', 1000);
INSERT INTO public.benefits
(id, workplace, province, benefits)
VALUES(4, '合肥', '西安', 1000);
INSERT INTO public.benefits
(id, workplace, province, benefits)
VALUES(5, '上海', '上海', 0);
INSERT INTO public.benefits
(id, workplace, province, benefits)
VALUES(6, '上海', '合肥', 1000);
INSERT INTO public.benefits
(id, workplace, province, benefits)
VALUES(7, '上海', '北京', 1000);
INSERT INTO public.benefits
(id, workplace, province, benefits)
VALUES(8, '上海', '西安', 1000);

方法一

在 PostgreSQL 中,如果你想将表中的某一列的数据变成列标题(通常被称为“列转行”或“交叉表”操作)
你可以使用 crosstab 函数,这个函数是 PostgreSQL 提供的 tablefunc 扩展中的一部分

安装 tablefunc 扩展

CREATE EXTENSION IF NOT EXISTS tablefunc;

安装成功,可以在扩展中查看
在这里插入图片描述

使用 crosstab 函数

SELECT *
FROM crosstab(
    $$SELECT workplace, province, benefits FROM postgres.public.benefits  
    ORDER BY workplace, province$$
) AS ct (workplace varchar, "合肥" int, "上海" int, "北京" int, "西安" int);

在这里,crosstab 函数的第一个参数是一个 SQL 查询,返回的结果必须包含三列:行标题列(workplace)、列标题列(province)和数值列(benefits )。第二个参数是结果表的列定义,必须明确指定每个新列的名称和数据类型。

注意事项

  • 列标题必须事先知道:在定义 crosstab 函数的输出列时,必须提前知道所有可能的列标题(即 province列的所有可能值)。
  • 数据类型匹配:定义的列数据类型必须与原始表中的数据类型匹配。
  • 数据量大的情况:如果有很多列(即 province的不同值很多),这个过程可能变得复杂,可以考虑动态生成列名和数据类型。

测试结果

在这里插入图片描述

方法二

除了使用 crosstab 函数,PostgreSQL 还可以使用条件聚合(conditional aggregation)来实现相同的效果。这种方法不需要安装 tablefunc 扩展,直接通过 SQL 语句中的聚合函数和 CASE 语句来实现。

SELECT
    workplace,
    MAX(CASE WHEN province = '合肥' THEN benefits ELSE 0 END) AS "合肥",
    MAX(CASE WHEN province = '上海' THEN benefits ELSE 0 END) AS "上海",
    MAX(CASE WHEN province = '北京' THEN benefits ELSE 0 END) AS "北京",
    MAX(CASE WHEN province = '西安' THEN benefits ELSE 0 END) AS "西安"
FROM
    postgres.public.benefits  
GROUP BY
    workplace;
  • MAX(CASE WHEN province = ‘合肥’ THEN benefits ELSE 0 END): 这个表达式会在 province 为 合肥 时返回 benefits 的值,否则返回 0。然后使用 MAX 函数来获取该组中最大的值(实际上这里只有一个非零值)
  • GROUP BY workplace: 按照 workplace 列进行分组,确保每个 workplace 只有一行结果。

优点

  • 不需要安装额外的扩展。
  • 直接在标准 SQL 中实现,易于理解和维护

缺点

  • 需要手动列出所有可能的 province 值,如果 province 值很多或者动态变化,维护起来可能比较繁琐。
  • 如果有很多列,这种方法的 SQL 语句会变得很长
    这种方法适用于列数较少且固定的情况。如果 province 列的值很多且可能动态变化,使用程序化的方法生成 SQL 语句可能更加高效

测试结果

在这里插入图片描述

深度解析 PostgreSQL 中的 ctid、xmin、xmax:从原理到实战 隐藏列数据类型核心作用ctidtid数据行的物理位置标识,指向数据在磁盘块中的具体位置xminxid生成当前数据行版本的事务ID(即“谁创建了这一行”)xmaxxid标记删除/替换当前数据行版本的事务ID(即“谁删除/更新了这一行”,0表示未被操作)注意:虽然这三个列是“隐藏”的,但可以通过SELECT语句直接查询(无需额外配置),这为我们观察数据变化提供了极大便利。ctidxminxmaxctid记录数据的物理位置,是定位数据的“指南针”;xmin标记数据版本的“创建者”,xmax。 阅读详情

相关推荐

数字后端DRC Violation定位与自动化修复:Innovus与Calibre协同实战

设计规则检查(DRC)是芯片tapeout前确保版图可制造性的关键验证环节。在数字后端流程中,Calibre作为signoff级物理验证工具,会依据代工厂SVRF规则文件对GDS进行严格几何检查;而Innovus则提供快速迭代的in-design DRC反馈。两者协同成为工程师定位violation、保障流片成功的主流工作流。面对成千上万条DRC violation,高效的定位与分类思路、跨工具映射技巧,以及基于Tcl脚本的自动化修复方法,能大幅缩短物理验证周期。本文从DRC的分层定位出发,结合Innovu

weixin_29185167的博客 335

如何将数据库某列的值(如日期)作为表格的列名

如何将数据库某列的值(如日期)作为表格的列名 需求:前端需要展示如下的二维表格,其中表格的日期是数据库表里data的值,每行不同的值是表格里的字段值,也就是需要将表里的数据行转列,列转行,本来想着通过sql和mybatis映射完成转换,但是搜了一下没有找到自己想要的方法,只好通过java代码来完成转换。 前端代码: <template> <div> <el-form :model="searchForm" ref="searchForm" size="small" :inl

weixin_45732391的博客 819

(ZOS-API)Matlab控制ZEMAX软件调整光学系统某镜面位姿

所用软件的版本:MatlabR2022a, Zemax OpticStudio2024R1交互扩展功能,Zemax和可以同时打开,操作会比较方便在ZEMAX软件中,调整次镜位置通常有两种方法:1.在次镜前后各添加一个坐标间断面,并修改其“偏心X”“偏心Y”等参数来调整次镜的位姿;2.或者直接在次镜属性选项中设置相关数值。这两种方法对Zernike系数的采集结果无显著影响。

ecilifurt的博客 911

pg数据库生成列

今天在项目中有一个需求,根据待出库数量大于0来筛选数据,但是问题是待出库数量在pg数据库表中并没有对应的字段,没有办法直接当作graphql查询条件。于是就引出了生成列这个概念。 1.什么是生成列 生成列或计算列对列的作用就像视图对表的作用一样。PostgreSQL 对计算列使用术语“生成”列。该列的值始终是从表中的其他列计算或生成的。生成的列可以是虚拟的或存储的。虚拟列的值是在查询期间动态计算的,它们不会占用存储空间。已存储的列的值已预先计算并存储为表数据的一部分。 2.怎么创建生成列 这里以待出库数

Thomasc的博客 1016

WSOLA原理及matlab仿真

WSOLA原理 对于 OLA 算法来说,常常无法保持原信号中的周期性结构,在帧裁剪的过程中,不能保证每一个帧都能覆盖完整周期并保证其相位对齐,会产生相位跳跃失真。 为保证**基频不变**,就要使用 WSOLA 算法。 WSOLA 并不直接在 Ha 处找一帧进行直接拼接,而是在一个区间内寻找与理想帧最接近的一帧进行叠加。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8a234f4fde104fc69a9f3ddb7bcf3014.png?x-oss-process=ima

ManiacLook的博客 3214

神经网络基础-从零开始搭建一个神经网络

人工神经网络(Articial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络和功能的计算模型,人脑可以看做是一个生物神经网络,由众多的神经元连接而成,各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。人工神经网络也是类似,通过模仿人脑的“学习机器”,通过不断“看”数据(比如图片,数字),自己总结规律,最终学会预测(比如分类图片)在深度学习中,损失函数是用来衡量模型参数的质量的函数,衡量的方式是比较网络输出和真实输出的差异。

Zach的博客 4014

mysql构造一个1-12数列,可用于与月份数据join给没有月份的填充0

SELECT @row := @row + 1 AS row FROM (select 0 union all select 1 ) t1, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 ) t2, (SELECT @row:=0) r1

qq_35968173的博客 694

2026年ComfyUI一键部署指南:秋叶整合包安装与API批量任务实战

节点式工作流是AI图像生成领域实现高度定制化和流程自动化的核心技术范式。其原理在于将图像生成的各个步骤(如提示词编码、模型加载、采样解码等)模块化为可连接、可配置的独立节点,用户通过可视化连线构建专属生成管线。这种架构的技术价值在于突破了固定界面的限制,提供了极致的灵活性与可重复性,尤其适合复杂工作流编排和批量生产任务。在应用场景上,它广泛应用于需要精细控制生成过程的研究、定制化内容创作以及自动化图像生成流水线。本文聚焦于ComfyUI这一代表性工具,详细解析如何通过秋叶整合包实现快速本地部署,并深入演示其

weixin_29056781的博客 539

PostgreSQL 生成列(Generated Columns)教程

PostgreSQL 12 增加新的特性——生成列(Generated Columns),也就是计算列。在之前版本也可以实现,但需要定义函数和触发器,利用该功能可以更容易使用并可以提升性能。 生成列是给表指定计算列,其数据可以根据其他列数据自动生成,当原数据更新时其自动更新。 PostgreSQL 12+ 生成列介绍 在PostgreSQL 12+中生成列作为内置功能,可以在创建或修改表时指定列作为生成列,指定其内容通过表达式自动填充,可以为简单基于其他进行数学运算,或更复杂的函数。其优势包括: 无需.

neweastsun的专栏 3719

如何在 SAP BTP 上通过 CDS view 快速创建 Fiori Elements 应用

本文基于 SAP Business Technology Platform 的 ABAP 编程环境进行的开发。 使用 ABAP Development Tool 登录 SAP BTP ABAP 编程环境,新建一个 package,命名为 Z_JERRY_CDS. 右键选中该 package,创建一个新的 Consumption view. 该视图是一个消费视图,它基于业务对象 (BO) 视图 /DMO/I_TRAVEL_U,提供了独立于消费层的给定数据模型。 它包含在其上运行的应用程序所需的所有核心信息。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2030

Python爬虫实战:爬取Bilibili和YouTube视频、弹幕和评论

随着视频内容平台的爆发式增长,视频网站成为了人们获取信息、娱乐和知识的重要渠道。在这些平台上,视频、弹幕和评论数据可以为我们提供重要的信息,帮助我们了解用户的行为、视频的受欢迎程度以及内容的互动情况。本篇文章将带你实现一个Python爬虫,用来爬取Bilibili和YouTube上的视频、弹幕、评论等数据。我们将详细介绍爬虫的实现过程,使用最新的Python技术,并且会提供完整的代码。Bilibili网站提供了多种方式来获取视频数据,最直接的方式是通过其开放的API接口来获取视频、弹幕和评论等数据。

2201_76125261的博客 1775

PostgreSQL 行转列

数据库 PostgreSQL 行转列 case when crosstab

Katherine_KK的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SQL 中的生成列/计算列以及主流数据库实现

在 SQL 数据库中,生成列(Generated Column)是指由表中其他字段计算得到的列,因此也称为计算列(Computed Column)。 本文介绍各种主流数据库对于生成列/计算列的实现,包括 Oracle、MySQL、SQL Server、PostgreSQL 以及 SQLite。

Tony.Dong的专栏 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

PostgreSQL单列多行变一行&一行变多行

工作中经常遇到这样一个场景,希望将某个字断查询出得结果组合成为一个字符串,用逗号分割(或者分号),通过PG中的函数该如何实现? 实例表: 想要的结果: 方法一:string_agg(字段名,分隔符) select id,string_agg(name,',') AS NAME_NEW from test group by 1 ORDER BY 1 方法二:array_agg(字段名) sel...

Lindsay的博客 5344

PostgreSQL合并查询同一列的多条记录

昨天遇到一个sql问题,需要将一个表中的某一列的多行数据拼接成一行 例如:表中有2列数据: 列1 列2 AAA 企业1 AAA 企业2 AAA 企业3 BBB 企业4 BBB 企业5 我想把这个表变成如下格式: 列1 列2 AAA...

郭芳的博客 1万+

PostgreSQL中生成的列

目录 介绍 背景 PostgreSQL 12 与SQL Server计算列比较 那么,生成的列与带有DEFAULT子句的常规列有何不同? 局限性 其他注意事项 PostgreSQL 11.x及更高版本 使用视图 使用普通列并使用触发器更新它 参考 介绍 生成列或计算列对列的作用就像视图对表的作用一样。PostgreSQL对计算列使用术语“生成”列。该列的值始终是从表中的...

寒冰屋的专栏 1335

postgresql行转列、列转行

postgresql列转行的思路主要是利用string_to_array。然后用unnest进行数组转换。行转列主要是用透视图crosstab相关函数。

★【World Of Moshow 郑锴】★ 1万+

SQL多行数据合并到一行中的一个字段

在SQL中,将多行数据转换为一行数据通常涉及到使用聚合函数和字符串函数。这种转换在数据库中被称为“行转列”或“透视”操作。

ItContentShare 3227

PostgreSQL 如何实现一个只有一行数据的表

在 PostgreSQL 中可以利用表达式索引(函数索引)基于常量值创建一个唯一索引,从而限制表中只能包含一行数据。同时,可以使用 INSERT ON CONFLICT 语句实现数据的插入和更新,通过触发器禁止防止数据被删除。

Tony.Dong的专栏 4002

postgresql中的默认列

default的语法规则在ColConstraintElem下,解析时会解析为Constraint,contype为CONSTR_DEFAULT 存在ColumnDef->constraints下。语义分析对应constraint 并且把表达式结果序列化插入pg_attrdef表中。default语法表达式赋值给raw_default。在重写阶段将表达式赋给对应value。

weixin_41685257的博客 280

PostgreSQL 列存索引

大数据时代,单一的数据库系统已经不能满足用户的所有业务需求,OLAP 场景往往数据量大,查询复杂,需使用专门的数据分析类产品,如 GreenPlum;OLTP 场景往往操作较简单,要求响应及时,这也是多数关系数据库系统擅长的场景。AP 系统的数据通常需要定期从 TP 系统同步以进行分析,这也就造成 AP 系统的实时性较差,如只能查询 T+1 的数据。为实...

weixin_34087307的博客 1075

列顺序占用存储大小的影响 in Oracle、MySQL、PostGreSQL

在创建表时,如果相同的列类型,不同表列的顺序是否会影响数据库占用空间大小?使用oracle、mysql或postgresql是不是相同的表现呢?不是的Postgresql近期发现空间使用会因为columns的顺序而占用不同的大小,当然也和实际的数据有关,简单的测试。

weixin_tank88921的博客 1713
上一篇: SpringBoot3+Mybatis-Plus+h2数据库,入门Mybatis-Plus
下一篇: 程序员如何学习开源项目
迷失的小鹿
博客等级 码龄8年 1万+粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值