PostgreSQL - 获取每个 GROUP BY 组中列的最大值的行

作者:编程家 分类: postgresql 时间:2025-07-13

PostgreSQL - 获取每个 GROUP BY 组中列的最大值的行

在使用 PostgreSQL 数据库进行数据分析和聚合时,经常会遇到需要获取每个 GROUP BY 组中列的最大值的行的情况。在本文中,我们将介绍如何使用 PostgreSQL 查询语言来实现这个目标,并提供一个案例代码来演示。

案例背景

假设我们有一个名为 "sales" 的表,其中包含了每天的销售数据。表的结构如下:

sql

CREATE TABLE sales (

id SERIAL PRIMARY KEY,

date DATE,

product_id INTEGER,

quantity INTEGER,

price NUMERIC(10,2)

);

我们想要找出每个产品的最高销售额在哪一天发生的,以及该销售额是多少。

查询语句

要实现这个目标,我们可以使用 PostgreSQL 的窗口函数和子查询来完成。首先,我们可以使用窗口函数找出每个产品的最高销售额,然后使用子查询找出对应的日期和数量。

下面是一个示例查询语句:

sql

SELECT s.date, s.product_id, s.quantity, s.price

FROM (

SELECT date, product_id, quantity, price,

RANK() OVER (PARTITION BY product_id ORDER BY price DESC) AS r

FROM sales

) s

WHERE s.r = 1;

这个查询语句中,我们首先使用窗口函数 `RANK()` 对每个产品进行排序,按照价格降序排列。然后,使用子查询将结果命名为 "s",并筛选出排名为 1 的行,即每个产品的最高销售额。

示例代码

为了更好地理解上述查询语句的工作原理,我们提供一个示例代码来演示。

首先,我们插入一些样本数据到 "sales" 表中:

sql

INSERT INTO sales (date, product_id, quantity, price)

VALUES

('2022-01-01', 1, 10, 100.00),

('2022-01-01', 2, 5, 50.00),

('2022-01-02', 1, 15, 150.00),

('2022-01-02', 2, 8, 80.00),

('2022-01-03', 1, 20, 200.00),

('2022-01-03', 2, 10, 100.00);

然后,我们执行上述查询语句来获取每个产品的最高销售额的行:

sql

SELECT s.date, s.product_id, s.quantity, s.price

FROM (

SELECT date, product_id, quantity, price,

RANK() OVER (PARTITION BY product_id ORDER BY price DESC) AS r

FROM sales

) s

WHERE s.r = 1;

执行以上查询语句后,我们将得到以下结果:

date | product_id | quantity | price

------------+------------+----------+-------

2022-01-03 | 1 | 20 | 200.00

2022-01-03 | 2 | 10 | 100.00

这表示产品 1 的最高销售额为 2022 年 1 月 3 日,销售额为 200.00;产品 2 的最高销售额也为 2022 年 1 月 3 日,销售额为 100.00。

在本文中,我们介绍了如何使用 PostgreSQL 查询语言来获取每个 GROUP BY 组中列的最大值的行。通过使用窗口函数和子查询,我们可以轻松地实现这个目标。在实际的数据分析和聚合过程中,这个功能非常有用,可以帮助我们找出每个组的最大值行,进而进行更深入的分析和决策。

希望本文对你在使用 PostgreSQL 进行数据分析和聚合时有所帮助!