PostgreSQL查询交叉表

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 交叉表(Cross Tabulations)是一种常用的分类汇总表格。利用交叉表查询数据非常直观明了,被广泛应用。交叉表查询也是数据库的一个特点。

PostgreSQL查询交叉表

什么是交叉表?

交叉表(Cross Tabulations) 是一种常用的分类汇总表格。利用交叉表查询数据非常直观明了,被广泛应用。交叉表查询也是数据库的一个特点。

概念

在统计学中,交叉表是矩阵格式的一种表格,显示变量的(多变量)频率分布。交叉表被广泛用于调查研究,商业智能,工程和科学研究。它们提供了两个变量之间的相互关系的基本画面,可以帮助他们发现它们之间的相互作用。卡尔·皮尔逊(Karl Pearson)首先在“关于应变的理论及其关联理论与正常相关性”中使用了交叉表。

多元统计学的一个关键问题是找到高维应变表中包含的变量的(直接)依赖结构。如果某些有条件的独立性被揭示,那么甚至可以以更智能的方式来完成数据的存储。为了做到这一点,可以使用信息理论概念,它只能从概率分布中获得信息,这可以通过相对频率从交叉表中容易地表示。

举例

假设我们有两个变量,性别(男性或女性)和手性(右或左手)。 进一步假设,从非常大的人群中随机抽取100个人,作为对手性的性别差异研究的一部分。 可以创建一个应变表来显示男性和右撇子,男性和左撇子,女性和右撇子以及女性和左撇子的个人数量。 这样的应变表如下所示。

Gender\Handedness Right Handed Left Handed Total
Male 43 9 52
Female 44 4 48
Total 87 13 100

男性,女性以及右撇子和左撇子个体的数量称为边际总数。总计(即应急表中所代表的个人总数)是右下角的数字。

这张表格让我们一目了然地看到,右撇子男子的比例与右撇子女性的比例大致相同。两种比例差异的意义可以通过各种统计检验来评估,包括Pearson的卡方检验,G检验,Fisher精确检验和巴纳德检验,条件是表中的条目代表从人口我们想得出结论。如果不同列中的个体的比例在行之间变化很大(反之亦然),则我们说两个变量之间存在偶然性。换句话说,这两个变量不是独立的。如果没有偶然性,我们说这两个变量是独立的。

上面的例子是最简单的交叉表,每个变量只有两个级别的表:这被称为2×2交叉表。原则上可以使用任何数量的行和列。也可能有两个以上的变量,但较高阶的偶然事件表难以在视觉上表示。序数变量之间或序数变量与分类变量之间的关系也可以用交叉表来表示,尽管这种做法很少见。

交叉报表

交叉报表是报表当中常见的类型,属于基本的报表,是行、列方向都有分组的报表。这里牵涉到另外一个概念即分组报表。这是所有报表当中最普通,最常见的报表类型,也是所有报表工具都支持的一种报表格式。从一般概念上来讲,分组报表就是只有纵向的分组。传统的分组报表制作方式是把报表划分为条带状,用户根据一个数据绑定向导指定分组,汇总字段,生成标准的分组报表。

转换查询交叉表

列式数据,即原始数据如下:

Name subject score
Lucy English 100
Lucy Physics 90
Lucy Math 85
Lily English 95
Lily Physics 81
Lily Math 84
David English 100
David Physics 86
David Math 89
Simon English 90
Simon Physics 76
Simon Math 79

行数据查询结果:

Name English Physics Math
Simon 90 76 79
Lucy 100 90 85
Lily 95 81 84
David 100 86 89

创建测试表

CREATE TABLE IF NOT EXISTS score
(
    name    VARCHAR,
    subject VARCHAR,
    score   FLOAT
);

插入测试数据

TRUNCATE TABLE score;
INSERT INTO score
    (name, subject, score)
VALUES ('Lucy', 'English', 100),
       ('Lucy', 'Physics', 90),
       ('Lucy', 'Math', 85),
       ('Lily', 'English', 95),
       ('Lily', 'Physics', 81),
       ('Lily', 'Math', 84),
       ('David', 'English', 100),
       ('David', 'Physics', 86),
       ('David', 'Math', 89),
       ('Simon', 'English', 90),
       ('Simon', 'Physics', 76),
       ('Simon', 'Math', 79);

1. 标准聚合函数查询

SELECT name,
       sum(CASE WHEN subject = 'English' THEN score ELSE 0 END) AS "English",
       sum(CASE WHEN subject = 'Physics' THEN score ELSE 0 END) AS "Physics",
       sum(CASE WHEN subject = 'Math' THEN score ELSE 0 END)    AS "Math"
FROM score
GROUP BY name
ORDER BY name DESC;

2. PostgreSQL聚合函数查询

SELECT name,
       split_part(split_part(tmp, ',', 1), ':', 2) AS "English",
       split_part(split_part(tmp, ',', 2), ':', 2) AS "Physics",
       split_part(split_part(tmp, ',', 3), ':', 2) AS "Math"
FROM (SELECT name,
             string_agg(subject || ':' || score, ',') AS tmp
      FROM score
      GROUP BY name
      ORDER BY name DESC) AS T;

3. crosstab交叉函数查询

首先需要安装tablefunc扩展,才能够使用crosstab函数。

CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab('SELECT name, subject, score FROM score ORDER BY name DESC',
              $$values ('English'::text),('Physics'::text),('Math'::text)$$
         ) AS score(name text, English int, Physics int, Math int);

参考资料

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
8月前
|
SQL 关系型数据库 PostgreSQL
把PostgreSQL的表导入SQLite
把PostgreSQL的表导入SQLite
117 0
|
8月前
|
存储 关系型数据库 数据库
postgresql|数据库|提升查询性能的物化视图解析
postgresql|数据库|提升查询性能的物化视图解析
761 0
|
2月前
|
SQL 关系型数据库 数据库
PostgreSQL性能飙升的秘密:这几个调优技巧让你的数据库查询速度翻倍!
【10月更文挑战第25天】本文介绍了几种有效提升 PostgreSQL 数据库查询效率的方法,包括索引优化、查询优化、配置优化和硬件优化。通过合理设计索引、编写高效 SQL 查询、调整配置参数和选择合适硬件,可以显著提高数据库性能。
431 1
|
5月前
|
缓存 关系型数据库 数据库
PostgreSQL 查询性能
【8月更文挑战第5天】PostgreSQL 查询性能
89 8
|
6月前
|
SQL 监控 关系型数据库
实时计算 Flink版操作报错合集之在设置监控PostgreSQL数据库时,将wal_level设置为logical,出现一些表更新和删除操作报错,怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
7月前
|
SQL 关系型数据库 数据库
Python执行PostgreSQL数据库查询语句,并打印查询结果
本文介绍了如何使用Python连接和查询PostgreSQL数据库。首先,确保安装了`psycopg2`库,然后创建数据库连接函数。接着,展示如何编写SQL查询并执行,例如从`employees`表中选取所有记录。此外,还讨论了处理查询结果、格式化输出和异常处理的方法。最后,提到了参数化查询和事务处理以增强安全性及确保数据一致性。
Python执行PostgreSQL数据库查询语句,并打印查询结果
|
6月前
|
Java 关系型数据库 API
使用Spring Boot和PostgreSQL构建高级查询
使用Spring Boot和PostgreSQL构建高级查询
|
7月前
|
SQL 关系型数据库 数据库
Python查询PostgreSQL数据库
木头左教你如何用Python连接PostgreSQL数据库:安装`psycopg2`库,建立连接,执行SQL脚本如创建表、插入数据,同时掌握错误处理和事务管理。别忘了性能优化,利用索引、批量操作提升效率。下期更精彩!💡 csvfile
Python查询PostgreSQL数据库
|
7月前
|
关系型数据库 PostgreSQL
postgresql如何将没有关联关系的两张表的字段合并
【6月更文挑战第2天】postgresql如何将没有关联关系的两张表的字段合并
163 3
|
7月前
|
SQL 关系型数据库 数据库连接
ClickHouse(20)ClickHouse集成PostgreSQL表引擎详细解析
ClickHouse的PostgreSQL引擎允许直接查询和插入远程PostgreSQL服务器的数据。`CREATE TABLE`语句示例展示了如何定义这样的表,包括服务器信息和权限。查询在只读事务中执行,简单筛选在PostgreSQL端处理,复杂操作在ClickHouse端完成。`INSERT`通过`COPY`命令在PostgreSQL事务中进行。注意,数组类型的处理和Nullable列的行为。示例展示了如何从PostgreSQL到ClickHouse同步数据。一系列的文章详细解释了ClickHouse的各种特性和表引擎。
207 0