SQL GROUP选取每组最大值

2024年09月25日 SQL GROUP选取每组最大值 极客笔记

SQL GROUP选取每组最大值

在SQL中,GROUP BY子句通常用于将结果集按照指定的列分组,并且可以对每个组进行聚合操作,例如COUNT、SUM等。但在某些情况下,我们可能需要在每个分组中选取某个特定列的最大值,这时就可以使用子查询或窗口函数来实现。

使用子查询选取每组最大值

首先让我们看一个示例表格,假设有一个sales表包含销售记录,每个销售记录中包括销售额和销售日期:

CREATE TABLE sales (
    id INT,
    amount DECIMAL(10, 2),
    sale_date DATE
);

INSERT INTO sales (id, amount, sale_date) VALUES
(1, 100.50, '2022-01-01'),
(2, 200.75, '2022-01-01'),
(3, 300.00, '2022-01-02'),
(4, 150.25, '2022-01-02'),
(5, 250.80, '2022-01-03');

现在我们需要选取每天销售额最大的记录,可以使用子查询的方式实现:

SELECT s1.id, s1.amount, s1.sale_date
FROM sales s1
INNER JOIN (
    SELECT sale_date, MAX(amount) AS max_amount
    FROM sales
    GROUP BY sale_date
) s2
ON s1.sale_date = s2.sale_date AND s1.amount = s2.max_amount;

运行以上SQL查询后,将得到以下结果:

id amount sale_date
3 300.00 2022-01-02
5 250.80 2022-01-03

以上查询首先通过子查询找到每天的最大销售额,然后通过INNER JOIN将每条记录与对应的最大销售额进行比较,最终筛选出每天销售额最大的记录。

使用窗口函数选取每组最大值

另一种方法是使用窗口函数,窗口函数可以计算每一行与特定分组的关联结果并返回一个值。下面我们将演示如何通过窗口函数选取每组最大值:

SELECT id, amount, sale_date
FROM (
    SELECT id, amount, sale_date, 
           ROW_NUMBER() OVER(PARTITION BY sale_date ORDER BY amount DESC) AS rn
    FROM sales
) t
WHERE t.rn = 1;

运行以上SQL查询后,将得到与之前相同的结果:

id amount sale_date
3 300.00 2022-01-02
5 250.80 2022-01-03

以上查询中通过ROW_NUMBER()窗口函数对每组按销售额进行降序排列,并给每行分配一个行号,然后筛选出行号为1的记录,即每组销售额最大的记录。

通过以上两种方法,我们可以灵活地从SQL查询结果中选取每组最大值,根据实际需求选择适合的方法来实现数据筛选和分析。

本文链接:http://so.lmcjl.com/news/13905/

展开阅读全文