2024年09月25日 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/