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

按Segment/Type组合提取各Level最新Med Spend值的SQL实现需求

问题解决:获取各Segment、Type组合下对应Level的最新Med Spend

需求

拥有月度历史数据,需针对两个Segment,计算每种Type与Level组合的Med Spend,并创建两个字段,展示各Segment、Type组合下对应Level的最新Med Spend值。

初始SQL代码

select Segment, Type, (select max([med spend]) from source where level = 'Gold') as 'Gold Spend',
    (select max([med spend]) from source where level = 'Silver') as 'Silver Spend'
        from source a
where a.date = (select max(b.date) from source b
where b.segment = a.segment and b.type = a.type)

源表

DateSegmentTypeLevelMed Spend
December 2022A0Gold1303
December 2022A1Gold1500
December 2022A0Silver1000
December 2022A1Silver1111
November 2022A0Gold500
November 2022A1Gold600
November 2022A0Silver450
November 2022A1Silver110
December 2022B0Gold210
December 2022B1Gold145
December 2022B0Silver540
December 2022B1Silver360
November 2022B0Gold777
November 2022B1Gold888
November 2022B0Silver125
November 2022B1Silver123

期望输出

SegmentTypeSilver SpendGold Spend
A010001303
A111111500
B0540210
B1360145

初始SQL的问题

  1. 子查询未关联维度:两个子查询select max([med spend]) from source where level = 'Gold'没有关联外层的a.Segment和a.Type,取的是全表所有对应Level记录的最大值,而非当前Segment、Type下的最新值。
  2. 结果重复:where a.date = (select max(b.date)...)会筛选出每个Segment、Type下所有Level的最新日期记录,导致每个Segment、Type对应两条结果(Gold和Silver各一条),且字段值不符合需求。

修正后的SQL方案

方案1:使用窗口函数筛选最新记录

WITH latest_data AS (
    SELECT 
        Segment,
        Type,
        Level,
        [Med Spend],
        -- 按Segment、Type、Level分组,日期倒序排序,取第一条为最新记录
        ROW_NUMBER() OVER (PARTITION BY Segment, Type, Level ORDER BY Date DESC) AS rn
    FROM source
)
SELECT 
    Segment,
    Type,
    -- 条件聚合将Level转为列
    MAX(CASE WHEN Level = 'Silver' THEN [Med Spend] END) AS [Silver Spend],
    MAX(CASE WHEN Level = 'Gold' THEN [Med Spend] END) AS [Gold Spend]
FROM latest_data
WHERE rn = 1 -- 只保留最新记录
GROUP BY Segment, Type
ORDER BY Segment, Type;

方案2:先获取最新日期再关联数据

WITH latest_dates AS (
    -- 先获取每个Segment、Type的最新日期
    SELECT Segment, Type, MAX(Date) AS latest_date
    FROM source
    GROUP BY Segment, Type
)
SELECT 
    ld.Segment,
    ld.Type,
    -- 关联后用条件聚合转列
    MAX(CASE WHEN s.Level = 'Silver' THEN s.[Med Spend] END) AS [Silver Spend],
    MAX(CASE WHEN s.Level = 'Gold' THEN s.[Med Spend] END) AS [Gold Spend]
FROM latest_dates ld
JOIN source s 
    ON ld.Segment = s.Segment 
    AND ld.Type = s.Type 
    AND ld.latest_date = s.Date
GROUP BY ld.Segment, ld.Type
ORDER BY ld.Segment, ld.Type;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:51:11