检索同一财年最远月份的值

问题描述 投票:0回答:1

我有一个数据集,其中行对应于在不同时间点收集的数据,如下所示:

公制 日期 财年 结果
访问 2022年3月1日 23 财年 17
访问 2022年4月1日 23 财年 21
访问 2022年5月1日 23 财年 34
访问 2022年6月1日 24 财年 99
访问 2022年7月1日 24 财年 11
访问 2022年8月1日 24 财年 27

我想添加一列,显示结果列中的值,其中 (a) 与当前月份处于同一财年,并且 (b) 位于最靠前的位置 -数据集中的每个指标都没有 12 个月前的值,有些可能有 3、7 个月或 11 个月等......

所需输出:

公制 日期 财年 结果 年前
访问 2022年3月1日 23 财年 17 17
访问 2022年4月1日 23 财年 21 17
访问 2022年5月1日 23 财年 34 17
访问 2022年6月1日 24 财年 99 99
访问 2022年7月1日 24 财年 11 99
访问 2022年8月1日 24 财年 27 99

我尝试在 case 语句中使用 LAG 来循环之前的 12 个月,但它返回 0,不确定多个表达式是否匹配或不匹配字符串和整数?

CASE 
    WHEN result <> 0 AND LAG(FY,1) = FY THEN COALESCE(LAG(result,1) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,2) = FY THEN COALESCE(LAG(result,2) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,3) = FY THEN COALESCE(LAG(result,3) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,4) = FY THEN COALESCE(LAG(result,4) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,5) = FY THEN COALESCE(LAG(result,5) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,6) = FY THEN COALESCE(LAG(result,6) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,7) = FY THEN COALESCE(LAG(result,7) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,8) = FY THEN COALESCE(LAG(result,8) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,9) = FY THEN COALESCE(LAG(result,9) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,10) = FY THEN COALESCE(LAG(result,10) OVER (PARTITION BY date ORDER BY date),0)
    WHEN result <> 0 AND LAG(FY,11) = FY THEN COALESCE(LAG(result,11) OVER (PARTITION BY date ORDER BY date),0)
ELSE 0
END AS year_ago
sql case
1个回答
0
投票

使用窗口函数和条件聚合很容易满足您的要求:

WITH cte AS (
    SELECT t.*, MIN(date) OVER (PARTITION BY FY) AS min_date
    FROM yourTable t
)

SELECT metric, date, FY, result,
       MAX(CASE WHEN date = min_date THEN result END) OVER (PARTIITON BY BY FY) year_ago
FROM cte
ORDER BY FY, date;
© www.soinside.com 2019 - 2024. All rights reserved.