使用预测数据继续现有 table 直到月底,并每天更新
Continue existing table until end of month with forecasted data and update daily
我想使用现有的每日收入数据在 Google Big Query 中创建一个新的 table,并使用基于现有数据的预测数据扩展这个新的 table并且需要创建。一旦某一天存在新的实际数据,它就会覆盖当天的预测数据。此外,到月底的预测数据将再次更新。
到目前为止,我想出了以下内容,它会生成 错误消息:Scalar subquery produced more than one element
SELECT
date, sum(yl_revenue), 'ACTUAL' as type
from project.dataset.table
where date >"2020-01-01" and date < current_date()
group by date
union distinct
SELECT
(select calendar_date
FROM
UNNEST(GENERATE_DATE_ARRAY('2020-01-01', DATE_SUB(DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH), INTERVAL 1 DAY), INTERVAL 1 DAY))
AS calendar_date),
avg(revenue_daily) as average_daily_revenue,
'FORECAST' as type FROM
(SELECT sum(revenue) as revenue_daily from project.dataset.table
WHERE date > "2020-01-01" and extract(month from date) = extract (month from current_date()) group by date)
我多么希望数据看起来像:
+------------+------------+----------+
| date | revenue | type |
+------------+------------+----------+
| 01.04.2020 | 100 € | ACTUAL |
| … | 5.000 € | ACTUAL |
| 23.04.2020 | 200 € | ACTUAL |
| 24.04.2020 | 230,43 € | FORECAST |
| 25.04.2020 | 230,43 € | FORECAST |
| 26.04.2020 | 230,43 € | FORECAST |
| 27.04.2020 | 230,43 € | FORECAST |
| 28.04.2020 | 230,43 € | FORECAST |
| 29.04.2020 | 230,43 € | FORECAST |
| 30.04.2020 | 230,43 € | FORECAST |
+------------+------------+----------+
第二天 (24.04.2020) 应该是这样的:
+------------+--------------+----------+
| date | revenue | type |
+------------+--------------+----------+
| 01.04.2020 | 100 € | ACTUAL |
| … | 5.000 € | ACTUAL |
| 23.04.2020 | 200 € | ACTUAL |
| 24.04.2020 | 1.000,00 € | ACTUAL | <----
| 25.04.2020 | 262,50 € | FORECAST |
| 26.04.2020 | 262,50 € | FORECAST |
| 27.04.2020 | 262,50 € | FORECAST |
| 28.04.2020 | 262,50 € | FORECAST |
| 29.04.2020 | 262,50 € | FORECAST |
| 30.04.2020 | 262,50 € | FORECAST |
+------------+--------------+----------+
预测值就是当月实际收入除以当月到目前为止的天数所得的总和。请注意,随着向其中添加新的实际值,每日预测值在第二个 table 中发生了变化。
非常感谢任何关于如何解决这个问题的帮助!
谢谢
一月
当新的一天更新时 - 您可以在下方运行更新其余日期
UPDATE `project.dataset.table`
SET revenue = (
SELECT ROUND(SUM(revenue) / COUNT(1), 2)
FROM `project.dataset.table`
WHERE type = 'ACTUAL'
)
WHERE type = 'FORECAST'
以上假设您有月表,其中预先创建了所有日期
如果您有不同的布局 - 上面可以轻松调整
我找到了解决问题的办法。 (虽然它可能不是最复杂的)
我现在想出了 3 个新的 table:
- 提供过去和未来的日期,这就是我称之为 'calendar'
的原因
- 提供当月的收入数据。我覆盖这个
table 每天都有一个预定的查询,它提供过去的实际情况
数据和预测的未来数据(基于实际数据
月)直到当月月底。
- 提供过去的数据(追溯到比当前月份更长的时间),加上每日
更新了 2) 中的数据。我也使用预定的
MERGE
查询。
以下是各自的查询:
1)
SELECT
*
FROM
UNNEST(GENERATE_DATE_ARRAY('2018-01-01', '2030-12-31', INTERVAL 1 DAY)) AS calendar_date
WITH
OFFSET
AS
OFFSET
ORDER BY
OFFSET
2)
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
date
UNION DISTINCT
SELECT
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` f
USING
`project.dataset.forecast_month` m
ON
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() THEN
INSERT
(date,
type,
revenue)
VALUES
(date, type, revenue)
我想使用现有的每日收入数据在 Google Big Query 中创建一个新的 table,并使用基于现有数据的预测数据扩展这个新的 table并且需要创建。一旦某一天存在新的实际数据,它就会覆盖当天的预测数据。此外,到月底的预测数据将再次更新。
到目前为止,我想出了以下内容,它会生成 错误消息:Scalar subquery produced more than one element
SELECT
date, sum(yl_revenue), 'ACTUAL' as type
from project.dataset.table
where date >"2020-01-01" and date < current_date()
group by date
union distinct
SELECT
(select calendar_date
FROM
UNNEST(GENERATE_DATE_ARRAY('2020-01-01', DATE_SUB(DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH), INTERVAL 1 DAY), INTERVAL 1 DAY))
AS calendar_date),
avg(revenue_daily) as average_daily_revenue,
'FORECAST' as type FROM
(SELECT sum(revenue) as revenue_daily from project.dataset.table
WHERE date > "2020-01-01" and extract(month from date) = extract (month from current_date()) group by date)
我多么希望数据看起来像:
+------------+------------+----------+
| date | revenue | type |
+------------+------------+----------+
| 01.04.2020 | 100 € | ACTUAL |
| … | 5.000 € | ACTUAL |
| 23.04.2020 | 200 € | ACTUAL |
| 24.04.2020 | 230,43 € | FORECAST |
| 25.04.2020 | 230,43 € | FORECAST |
| 26.04.2020 | 230,43 € | FORECAST |
| 27.04.2020 | 230,43 € | FORECAST |
| 28.04.2020 | 230,43 € | FORECAST |
| 29.04.2020 | 230,43 € | FORECAST |
| 30.04.2020 | 230,43 € | FORECAST |
+------------+------------+----------+
第二天 (24.04.2020) 应该是这样的:
+------------+--------------+----------+
| date | revenue | type |
+------------+--------------+----------+
| 01.04.2020 | 100 € | ACTUAL |
| … | 5.000 € | ACTUAL |
| 23.04.2020 | 200 € | ACTUAL |
| 24.04.2020 | 1.000,00 € | ACTUAL | <----
| 25.04.2020 | 262,50 € | FORECAST |
| 26.04.2020 | 262,50 € | FORECAST |
| 27.04.2020 | 262,50 € | FORECAST |
| 28.04.2020 | 262,50 € | FORECAST |
| 29.04.2020 | 262,50 € | FORECAST |
| 30.04.2020 | 262,50 € | FORECAST |
+------------+--------------+----------+
预测值就是当月实际收入除以当月到目前为止的天数所得的总和。请注意,随着向其中添加新的实际值,每日预测值在第二个 table 中发生了变化。
非常感谢任何关于如何解决这个问题的帮助!
谢谢
一月
当新的一天更新时 - 您可以在下方运行更新其余日期
UPDATE `project.dataset.table`
SET revenue = (
SELECT ROUND(SUM(revenue) / COUNT(1), 2)
FROM `project.dataset.table`
WHERE type = 'ACTUAL'
)
WHERE type = 'FORECAST'
以上假设您有月表,其中预先创建了所有日期 如果您有不同的布局 - 上面可以轻松调整
我找到了解决问题的办法。 (虽然它可能不是最复杂的)
我现在想出了 3 个新的 table:
- 提供过去和未来的日期,这就是我称之为 'calendar' 的原因
- 提供当月的收入数据。我覆盖这个 table 每天都有一个预定的查询,它提供过去的实际情况 数据和预测的未来数据(基于实际数据 月)直到当月月底。
- 提供过去的数据(追溯到比当前月份更长的时间),加上每日
更新了 2) 中的数据。我也使用预定的
MERGE
查询。
以下是各自的查询:
1)
SELECT
*
FROM
UNNEST(GENERATE_DATE_ARRAY('2018-01-01', '2030-12-31', INTERVAL 1 DAY)) AS calendar_date
WITH
OFFSET
AS
OFFSET
ORDER BY
OFFSET
2)
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
date
UNION DISTINCT
SELECT
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` f
USING
`project.dataset.forecast_month` m
ON
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() THEN
INSERT
(date,
type,
revenue)
VALUES
(date, type, revenue)