我有一个数据集,其中行对应于在不同时间点收集的数据,如下所示:
公制 | 日期 | 财年 | 结果 |
---|---|---|---|
访问 | 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
使用窗口函数和条件聚合很容易满足您的要求:
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;