假设我有初始日期表和日期的每个订单值:
date_order |gross_order|
|---------- |-----------|
|25 Nov | 50 |
|27 Nov |300 |
|26 Dec | 400 |
|29 Dec |300 |
|30 Dec |100 |
所以我使用这个查询来计算当前的 MTD(从某个月的第 1 天到该月的某个日期的一个月内的累计总订单),
select date_order, gross_order, sum(gross_order) OVER (PARTITION date_trunc(date_order,MONTH ORDER BY date_order) AS current_mtd
结果将是这样的:
|date_order |gross_order| current_mtd |
|---------- |-----------|-------------|
|25 Nov | 50 | 50 |
|27 Nov |300 |350 |
|26 Dec | 400 |400 |
|29 Dec |300 |700 |
|30 Dec |100 |800 |
这个想法是在日期范围内的所有行都具有上个月的 MTD 值,因此在 11 月 25 日和 27 日,之前的 MTD 值将为 0,因为没有先前的总订单值。在 12 月 30 日的行中,该值将是 11 月 1 日到 30 日之间的总和,即 50 + 350 = 400
预期结果:
|date_order |gross_order| current_mtd | previous_mtd
|---------- |-----------|-------------|-------------|
|25 Nov | 50 | 50 |0 |
|27 Nov |300 |350 |0 |
|26 Dec | 400 |400 |50 |
|29 Dec |300 |700 |350 |
|30 Dec |100 |800 |350 |
我对如何计算以前的 mtd 值有点困惑,有什么办法吗?谢谢
答案 0 :(得分:1)
既然我理解了这个问题,您可以使用相关子查询:
with t as (
select date '2020-11-25' as date_order, 50 as gross_order union all
select date '2020-11-27' as date_order, 300 as gross_order union all
select date '2020-12-26' as date_order, 400 as gross_order union all
select date '2020-12-29' as date_order, 300 as gross_order union all
select date '2020-12-30' as date_order, 100 as gross_order
)
select t.*,
(select sum(t2.gross_order)
from t t2
where date_trunc(t2.date_order, month) = date_add(date_trunc(t.date_order, month), interval -1 month) and
extract(day from t2.date_order) <= extract(day from t.date_order)
)
from t;
子查询匹配上个月的行(第一个条件),然后比较日期(第二个条件)。
这适用于您提供的数据。