PostgreSQL-05-入门篇-数据分组

news/2024/9/17 18:16:42/ 标签: postgresql, 数据库

文章目录

    • 1. GROUP BY 分组
      • 简介
      • 示例
        • 1) 不使用聚合函数的 `GROUP BY`
        • 2) 使用 `SUM()` 函数的 `GROUP BY`
        • 3) 结合 `JOIN` 子句的 `GROUP BY`
        • 4) 使用 `COUNT()` 函数的 `GROUP BY`
        • 5) 多列 `GROUP BY`
        • 6) 使用日期列的 `GROUP BY`
    • 2. HAVING 子句
      • 简介
      • HAVING 对比 WHERE
      • PostgreSQL HAVING 子句示例
        • 1) 使用 HAVING 子句和 SUM 函数的示例
        • 2) 使用 HAVING 子句和 COUNT 函数的示例
    • 3. PARTITION BY 分区计算
      • 简介
      • PARTITION BY 与 GROUP BY

1. GROUP BY 分组

简介

  • GROUP BY 子句用于将 SELECT 语句返回的行分组。可以使用聚合函数(如 SUM()COUNT())对每个组进行计算。

基本语法如下:

SELECT column_1, column_2,...,aggregate_function(column_3)
FROM table_name
GROUP BY column_1,column_2,...;

PostgreSQL 计算GROUP BY子句的时间点,在FROMWHERE子句之后, , 以及HAVINGSELECTDISTINCTORDER BYLIMIT子句之前。

在这里插入图片描述

示例

1) 不使用聚合函数的 GROUP BY
SELECTcustomer_id
FROMpayment
GROUP BYcustomer_id;

在这里插入图片描述

在这种情况下,GROUP BY工作方式类似于从结果集中删除重复行的DISTINCT子句。

2) 使用 SUM() 函数的 GROUP BY
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id;

在这里插入图片描述

以下语句使用带GROUP BY子句的ORDER BY子句对分组进行排序:

SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id
ORDER BY
SUM (amount) DESC;

在这里插入图片描述

3) 结合 JOIN 子句的 GROUP BY
SELECT
first_name || ' ' || last_name full_name,
SUM (amount) amount
FROM
payment
INNER JOIN customer USING (customer_id)    
GROUP BY
full_name
ORDER BY amount DESC;

在这里插入图片描述

4) 使用 COUNT() 函数的 GROUP BY
SELECT
staff_id,
COUNT (payment_id)
FROM
payment
GROUP BY
staff_id;

在这里插入图片描述

GROUP BY子句将付款中的行分为几组,并按staff_id列中的值对它们进行分组。对于每个组,它使用COUNT()函数返回行数。

5) 多列 GROUP BY

以下示例在GROUP BY子句中使用多个列:

SELECT 
customer_id, 
staff_id, 
SUM(amount) 
FROM 
payment
GROUP BY 
staff_id, 
customer_id
ORDER BY customer_id;

在此示例中,GROUP BY子句将payment表中的行按照customer_idstaff_id列中的值划分组。对于(customer_id, staff_id)的每组,使用SUM()计算总金额。

在这里插入图片描述

6) 使用日期列的 GROUP BY

payment_date是一个时间戳列。要按日期对付款进行分组,您可以使用DATE()函数首先将时间戳转换为日期,然后按结果日期对付款进行分组:

SELECT 
DATE(payment_date) paid_date, 
SUM(amount) sum
FROM 
payment
GROUP BY
DATE(payment_date);

在这里插入图片描述

2. HAVING 子句

简介

HAVING子句指定分组或聚合的搜索条件。HAVING子句通常与GROUP BY子句一起使用,以根据指定条件过滤分组或聚合。

以下语句说明了HAVING子句的基本语法:

SELECT
column1,
aggregate_function (column2)
FROM
table_name
GROUP BY
column1
HAVING
condition;

还可以添加SELECT语句的其他子句,例如JOINLIMITFETCH等。

PostgreSQL 计算HAVING子句的时间点,在FROMWHEREGROUP BY子句之后,在SELECTDISTINCTORDER BYLIMIT子句之前。

在这里插入图片描述

由于HAVING子句在SELECT列表子句之前求值,因此不能在HAVING子句中使用列别名。因为在计算HAVING子句时,SELECT列表子句中指定的列别名还不可用。

HAVING 对比 WHERE

WHERE子句允许您根据指定条件过滤行。但是,HAVING子句允许您根据指定条件过滤行组。

换句话说,WHERE子句应用于行,而HAVING子句应用于行组。

PostgreSQL HAVING 子句示例

1) 使用 HAVING 子句和 SUM 函数的示例

以下查询使用带有SUM()函数的GROUP BY子句来查找每个客户的总金额:

SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id;

在这里插入图片描述

以下语句添加了HAVING 子句来查询支出超过200的客户:

SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id
HAVING
SUM (amount) > 200;

在这里插入图片描述

2) 使用 HAVING 子句和 COUNT 函数的示例

以下查询使用GROUP BY子句来查找每个商店的顾客数量:

SELECT
store_id,
COUNT (customer_id)
FROM
customer
GROUP BY
store_id

在这里插入图片描述

以下语句添加了HAVING子句来查找拥有超过 300 名顾客的商店:

SELECT
store_id,
COUNT (customer_id)
FROM
customer
GROUP BY
store_id
HAVING
COUNT (customer_id) > 300;

在这里插入图片描述

3. PARTITION BY 分区计算

简介

  • PARTITION BY 子句是 OVER 子句的一部分。它将查询结果集划分为多个分区,使得窗口函数可以在每个分区内独立计算。

基本语法如下:

window_function ( expression ) OVER (PARTITION BY expression1, expression2, ...order_clauseframe_clause
)

可以指定一个或多个列或表达式来对结果集进行分区。这些表达式必须引用 FROM 子句中的列,不能引用 SELECT 列表中的表达式或别名。

PARTITION BY 子句的表达式可以是列表达式、标量子查询或标量函数。请注意,标量子查询和标量函数始终返回单个值。

如果省略 PARTITION BY 子句,则整个结果集将被视为单个分区。

PARTITION BY 与 GROUP BY

  • GROUP BY 子句通常与聚合函数(如 SUM()AVG())结合使用。GROUP BY 子句会汇总和计算每组的总和或平均值,从而减少返回的行数。

例如,以下语句返回按部门划分的员工平均工资:

SELECT department_id, ROUND(AVG(salary)) avg_department_salary
FROMemployees
GROUP BY department_id
ORDER BYdepartment_id;

下图显示了结果:

在这里插入图片描述

  • PARTITION BY 子句将结果集划分为多个分区,并更改窗口函数的计算方式。PARTITION BY 子句不会减少返回的行数。

以下语句返回员工的工资及其所在部门的平均工资:

SELECT first_name,last_name,department_id, ROUND(AVG(salary) OVER (PARTITION BY department_id)) avg_department_salary
FROMemployees;

以下是部分输出:

在这里插入图片描述

简而言之,GROUP BY子句是聚合性的,而PARTITION BY子句是分析型的。


http://www.ppmy.cn/news/1524929.html

相关文章

【Java-简单练习题】

1.”AABBBCCC“>>"A2B3C3" public class Test6 {public static void main(String[] args) {String ns "AABBBCCCC";String retcompress(ns);System.out.println(ret);}public static String compress(String str) {StringBuilder ret new StringB…

Linux如何使用sed命令进行文本替换

在Linux中,sed(Stream Editor)是一个用于处理文本流的命令行工具,它非常适合用于执行基本的文本转换。sed可以读取输入的文本文件,根据指定的指令对文本进行处理,并将结果输出到标准输出设备。以下是如何使…

数据库的约束

数据库约束 数据库对数据的合法性进行校验检查,避免数据库中被插入,修改一些非法的数据。 数据库约束类型 not null - 指示某列不能存储 null值 下图就是具体展示,未进行约束时可以进行填入null,约束之后就不能进行填入&#…

直播相关01-录制麦克风声音,QT上 .pro 将 linux,mac和windows上配置为三种可以共享, 在.pro文件中 message 的作用

一 QT 上的 .pro 文件 将 linux,mac和windows上配置设置为可以共享 1. 先来看文件夹布局 2. 再来看 QT 中的 .pro文件 .pro 文件的写法 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler …

git svn 日记

1. git log -p -1 --name-only 该命令用于查看最新的一次提交记录的详细信息,包括文件更改情况。 git log:显示 Git 仓库的提交历史。-p:显示每次提交的差异 (diff),也就是文件内容的修改部分。-1:表示只显示最近的一…

Vue3.0项目实战(三)——大事件管理系统首页 layout 架子与文章分类的实现

目录 1. 首页 layout 架子 [element-plus 菜单] 1.1 基本架子拆解 2. 登录访问拦截 2.1 需求 2.2 vue3 和 vue2 中的 Vue-Router 区别 3. 用户基本信息获取&渲染 4. 退出功能 [element-plus 确认框] 5. 文章分类页面 - [element-plus 表格] 5.1 基本架子 - PageCo…

PHP即刻送达同城派送小程序系统

即刻送达,同城派送小程序系统让生活更便捷 🚀 瞬间连接,即刻送达的奇迹 你是否曾经因为等待快递而焦急万分?是否渴望有一种方式能让物品像魔法一样瞬间出现在你面前?现在,有了“即刻送达同城派送小程序系…

RHCE--复习(一)之系统延迟任务及定时任务

系统延迟任务及定时任务 #关闭图形命令(第二次开启的时候)[rootlocalhost ~]# systemctl set-default multi-user.target#windos系统级别类型 0-6个级别#查看级别类型[rootlocalhost ~]# runlevel 一、延迟任务 在系统中我们的维护工作大多数时在服务器…

MySQL定长窗口SQL

SQL 定长窗口(Sliding Window)是一种使用窗口函数来处理一段固定范围内的数据。这种方式可以对一定范围内的数据进行聚合或分析,并且窗口会随着数据的行逐步滑动。 在 SQL 中,窗口函数常与 OVER() 子句一起使用,定义一…

Swift 创建扩展(Extension)

类别(Category) 和 扩展(Extension) 的 用法很多. 常用的 扩展(Extension) 有分离代码和封装模块的功能,例如登陆页面有注册功能,有登陆功能,有找回密码功能,都写在一个页面就太冗余了,可以考虑使用 扩展(Extension) 登陆页面的方法来分离代码 本文介绍Swift 如何创建扩展(Ex…

Linux cut命令详解使用:掌握高效文本切割

cut 是 Linux 中一个用于从文本文件或标准输入中提取指定字段的命令。它根据分隔符或者字符位置来裁剪文本,是处理文本文件中的字段、列和子字符串的常用工具。 基本语法 cut [选项] 文件或 命令 | cut [选项]常用选项 -b:按字节位置切割&#xff08…

HTML+CSS箭头闪动

HTML+CSS实现箭头闪动,效果如下: 代码如下: <div class="design_ani_item"><div class="arrow"><em></em></div><div class="arrow"><em></em></div><div class="arrow"…

text-overflow:ellipsis 不生效的情况解决办法

<swiper :autoplay"true" :interval"3000" :duration"1000" circular vertical><swiper-item v-for"item in 4">文字内容文字内容文字内容文字内容文字内容文字内容文字内容文字内容文字内容文字内容文字内容文字内容文字…

Jmeter_循环获取请求接口的字段,并写入文件

通过JSON提取器、计数器、beanshell&#xff0c;循环读取邮箱接口的返回字段&#xff0c;筛选出flag为3的收件人&#xff0c;并写入csv文件。 1、调用接口&#xff0c;获取所有的邮件$.data.total.count&#xff1b; 2、beanshell后置处理total转换成页码&#xff0c;这里是227…

Android 进程间通信

在 Android 中&#xff0c;进程间通信 (IPC, Inter-Process Communication) 是指在不同进程之间进行数据交换的机制。Android 提供了几种主要的 IPC 方法&#xff0c;每种方法适用于不同的场景。 1. Binder 机制 Binder 是 Android 核心的 IPC 机制&#xff0c;底层是通过操作…

联蔚盘云再获发明专利授权—多云环境下云资源自动化运维的方法与设备

上海联蔚盘云科技有限公司荣获了一项重要的发明专利——“多云环境下云资源自动化运维的方法与设备”&#xff08;专利授权号&#xff1a;CN 112667468 B&#xff09;。该专利旨在解决企业在多云环境下云资源管理和自动化运维的难题&#xff0c;标志着公司在云计算技术领域取得…

Facebook Marketplace:防封与出单策略

Facebook Marketplace为用户提供一个在本地交易商品的平台&#xff0c;包括二手商品、房屋出租和家政服务等都可以在上面检索到相关信息。据数据统计&#xff0c;每月约有4亿人使用Facebook Marketplace功能&#xff0c;潜力巨大&#xff0c;为商家提供了广阔的商机。然而&…

Java集成开发环境(IDE)之 => “IntelliJ IDEA“ 安装

一、软件介绍 IntelliJ IDEA 是一款由 JetBrains 公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它主要用于 Java 语言的开发&#xff0c;但同时也支持多种其他编程语言&#xff0c;如 Kotlin、Groovy、Scala、Python、Ruby、PHP、JavaScript、TypeScript 等…

Linux创建虚拟磁盘并分区格式化

快速创建一个虚拟磁盘 你可以通过以下步骤在Linux上虚拟一个磁盘&#xff0c;并将其挂载到 /mnt/ 目录下&#xff1a; 步骤 1: 创建一个虚拟磁盘文件 使用 dd 命令创建一个虚拟磁盘文件&#xff08;例如大小为1GB&#xff09;&#xff1a; dd if/dev/zero of/root/virtual_…

算力服务器和GPU服务器的区别是什么?

随着互联网科技的快速发展&#xff0c;服务器的类型也变得多种多样了&#xff0c;今天小编就来为大家介绍一下算力服务器和GPU服务器还有他们之间的区别是什么&#xff1f; 算力服务器通常是指具有着较高计算能力的服务器&#xff0c;算力服务器一般都是用于处理大量的计算任务…