我找到了解决问题的方法。(尽管它可能不是最复杂的一种)
我现在想出了3个新表:
- 提供过去和将来的日期,这就是为什么我称其为“日历”
- 提供当月的收入数据。我每天都使用计划查询覆盖该表,该查询提供了实际的过去数据和预测的未来数据(基于当月的实际数据),直到当前月末。
- 提供过去的数据(回溯的时间比当月还长),再加上2中的每日更新数据。我也使用预定
MERGE
查询。
以下是各个查询:
1)
SELECt *FROM UNNEST(GENERATE_DATE_ARRAY('2018-01-01', '2030-12-31', INTERVAL 1 DAY)) AS calendar_dateWITHOFFSET ASOFFSETORDER BYOFFSET2)
SELECt date, 'actual' AS type, ROUND(SUM(revenue),2)FROM `project.dataset.revenue_data` WHERe EXTRACT(year FROM date) = EXTRACT (year FROM CURRENT_DATE()) AND EXTRACT(month FROM date) = EXTRACT (month FROM CURRENT_DATE())GROUP BY dateUNIOn DISTINCTSELECt calendar_date, 'forecast', ( SELECT ROUND(AVG(revenue_daily),2) FROM ( SELECt SUM(revenue) AS revenue_daily FROM `project.dataset.revenue_data` WHERe EXTRACT(year FROM date) = EXTRACT (year FROM CURRENT_DATE()) AND EXTRACT(month FROM date) = EXTRACT (month FROM CURRENT_DATE()) GROUP BY date ORDER BY date) AS average_daily_revenue),FROM `project.dataset.calendar`WHERe calendar_date >= CURRENT_DATE() AND calendar_date <=DATE_SUB(DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH), INTERVAL 1 DAY)ORDER BY date
3)
MERGE `project.dataset.forecast_table` fUSING `project.dataset.forecast_month` mON f.date = m.date WHEN MATCHED THEN UPDATE SET f.type = m.type, f.revenue = m.revenue WHEN NOT MATCHED AND m.date >= CURRENT_DATE() THENINSERT (date, type, revenue)VALUES (date, type, revenue)



