You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询:获取金额逐年持续增长的品牌全量记录

如何查询金额逐年增长的品牌的全部记录?

我有一张包含year_v、Brand、Amount三列的数据表,需要编写SQL查询语句返回金额逐年增长的品牌的全部记录。以下是示例输入与预期输出:

输入表结构与数据

year_vBrandAmount
2018P&G50000
2019P&G45000
2020P&G60000
2018IBM55000
2019IBM60000
2020IBM70000
2018EY80000
2019EY40000
2020EY36000

预期输出

year_vBrandAmount
2018IBM55000
2019IBM60000
2020IBM70000

只有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;

逻辑说明:

  1. LAG(Amount) OVER (PARTITION BY Brand ORDER BY year_v):按品牌分组、年份排序,获取每个品牌上一年的金额。
  2. 通过CASE语句标记当前年份金额是否小于等于上一年(即未增长),对每个品牌取MAX(has_decrease)——如果值为0,说明该品牌所有年份金额都是逐年增长的。
  3. 最后将原表与筛选结果关联,返回符合条件品牌的全部记录。

方法二:统计未增长次数筛选品牌

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;

逻辑说明:

  1. 子查询中标记每个品牌的每一年是否未增长,分组后统计未增长的次数。
  2. 仅保留未增长次数为0的品牌,最后用IN子查询筛选原表中这些品牌的所有记录。

内容的提问来源于stack exchange,提问作者Sagar tate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:30:46