SQL查询:获取金额逐年持续增长的品牌全量记录
如何查询金额逐年增长的品牌的全部记录?
我有一张包含year_v、Brand、Amount三列的数据表,需要编写SQL查询语句返回金额逐年增长的品牌的全部记录。以下是示例输入与预期输出:
输入表结构与数据
| year_v | Brand | Amount |
|---|---|---|
| 2018 | P&G | 50000 |
| 2019 | P&G | 45000 |
| 2020 | P&G | 60000 |
| 2018 | IBM | 55000 |
| 2019 | IBM | 60000 |
| 2020 | IBM | 70000 |
| 2018 | EY | 80000 |
| 2019 | EY | 40000 |
| 2020 | EY | 36000 |
预期输出
| year_v | Brand | Amount |
|---|---|---|
| 2018 | IBM | 55000 |
| 2019 | IBM | 60000 |
| 2020 | IBM | 70000 |
只有IBM的金额每年均呈增长趋势,因此返回它的所有记录。
解决方案
我们可以利用SQL窗口函数LAG()来对比每个品牌相邻年份的金额,筛选出全程没有金额下降的品牌,再关联原表返回所有记录。
方法一:使用CTE标记并筛选品牌
WITH brand_growth_check AS ( SELECT Brand, -- 只要有一年金额没增长,这个值就会是1 MAX(CASE WHEN Amount <= LAG(Amount) OVER (PARTITION BY Brand ORDER BY year_v) THEN 1 ELSE 0 END) AS has_decrease FROM your_table_name -- 替换为你的实际表名 GROUP BY Brand ) SELECT t.* FROM your_table_name t JOIN brand_growth_check bgc ON t.Brand = bgc.Brand WHERE bgc.has_decrease = 0 ORDER BY t.Brand, t.year_v;
逻辑说明:
LAG(Amount) OVER (PARTITION BY Brand ORDER BY year_v):按品牌分组、年份排序,获取每个品牌上一年的金额。- 通过
CASE语句标记当前年份金额是否小于等于上一年(即未增长),对每个品牌取MAX(has_decrease)——如果值为0,说明该品牌所有年份金额都是逐年增长的。 - 最后将原表与筛选结果关联,返回符合条件品牌的全部记录。
方法二:统计未增长次数筛选品牌
WITH valid_brands AS ( SELECT Brand FROM ( SELECT Brand, -- 标记当前年份是否未实现增长 Amount <= LAG(Amount) OVER (PARTITION BY Brand ORDER BY year_v) AS is_not_growing FROM your_table_name -- 替换为你的实际表名 ) sub_query GROUP BY Brand -- 未增长的次数为0,说明全程增长 HAVING COUNT(CASE WHEN is_not_growing THEN 1 END) = 0 ) SELECT * FROM your_table_name WHERE Brand IN (SELECT Brand FROM valid_brands) ORDER BY Brand, year_v;
逻辑说明:
- 子查询中标记每个品牌的每一年是否未增长,分组后统计未增长的次数。
- 仅保留未增长次数为0的品牌,最后用
IN子查询筛选原表中这些品牌的所有记录。
内容的提问来源于stack exchange,提问作者Sagar tate
相关产品推荐
相关产品推荐

