Sql 使用预测数据继续现有表格,直到月底,并每天更新
我想用现有的每日收入数据在Google Big Query中创建一个新表,并用预测数据扩展这个新表,预测数据基于现有数据,需要创建。一旦某一天存在新的实际数据,它将覆盖该天的预测数据。此外,直到月底的预测数据将再次更新 到目前为止,我提出了以下内容,它生成了一条错误消息:Sql 使用预测数据继续现有表格,直到月底,并每天更新,sql,google-bigquery,forecasting,Sql,Google Bigquery,Forecasting,我想用现有的每日收入数据在Google Big Query中创建一个新表,并用预测数据扩展这个新表,预测数据基于现有数据,需要创建。一旦某一天存在新的实际数据,它将覆盖该天的预测数据。此外,直到月底的预测数据将再次更新 到目前为止,我提出了以下内容,它生成了一条错误消息:标量子查询生成了多个元素 SELECT date, sum(yl_revenue), 'ACTUAL' as type from project.dataset.table
标量子查询生成了多个元素
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)
第二天(2020年4月24日),它应该是这样的:
+------------+--------------+----------+
| 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 |
+------------+--------------+----------+
+------------+--------------+----------+
|日期|收入|类型|
+------------+--------------+----------+
|2020年4月1日| 100欧元|实际|
|…实际为5000欧元|
|2020年4月23日200欧元实际|
|2020年4月24日| 1.000,00€|实际|当更新新的一天时-您可以在下面运行以更新剩余的一天
UPDATE `project.dataset.table`
SET revenue = (
SELECT ROUND(SUM(revenue) / COUNT(1), 2)
FROM `project.dataset.table`
WHERE type = 'ACTUAL'
)
WHERE type = 'FORECAST'
以上假设您有预先创建的所有天数的月度表
如果您有不同的布局-当新的一天更新时,可以轻松地调整上面的布局-您可以在下面运行以更新其余的一天
UPDATE `project.dataset.table`
SET revenue = (
SELECT ROUND(SUM(revenue) / COUNT(1), 2)
FROM `project.dataset.table`
WHERE type = 'ACTUAL'
)
WHERE type = 'FORECAST'
以上假设您有预先创建的所有天数的月度表
如果您有不同的布局-可以轻松调整上面的布局我找到了解决问题的方法。(虽然它可能不是最复杂的)
我现在提出了3个新表:
提供过去和未来的日期,这就是为什么我称之为“日历”
提供当月的收入数据。我覆盖了这个
表中每天都有一个预定的查询,它提供了实际的过去
数据和预测未来数据(基于项目的实际数据)
月),直到本月底
提供过去的数据(追溯时间超过当前月份),以及每日
更新了第2页的数据。我也使用一个预定的MERGE
查询
以下是有关的查询:
(一)
(二)
我找到了解决问题的办法。(虽然它可能不是最复杂的)
我现在提出了3个新表:
提供过去和未来的日期,这就是为什么我称之为“日历”
提供当月的收入数据。我覆盖了这个
表中每天都有一个预定的查询,它提供了实际的过去
数据和预测未来数据(基于项目的实际数据)
月),直到本月底
提供过去的数据(追溯时间超过当前月份),以及每日
更新了第2页的数据。我也使用一个预定的MERGE
查询
以下是有关的查询:
(一)
(二)
谢谢@mikhail。但实际上我需要早点开始。我每天只得到实际收入数据。我想到的是:。。。1) 我得到每天收入的总和,并在这些数据中写一个默认值为“实际”的新的第三列。2) 我加上迄今为止的平均每日收入,并将结果写在该月剩余日期的每一行中。以及所述第三列中的默认值“FORECAST”。现在我被困在如何重复每一行的预测值上。有没有办法更新整行而不仅仅是收入值?我还需要更新/更改日期和类型。当然,只要阅读更多有关更新的文档,您就会看到语法。同时考虑接受答案。如果您有新的/更多问题,请在new postAlright中发布,谢谢。我刚刚在一篇新帖子中提出了关于这个问题的进一步问题,但你关闭了它,引用了这个帖子,不幸的是,这并没有解决我的问题。我应该把它贴在这里吗?谢谢@mikhail。但实际上我需要早点开始。我每天只得到实际收入数据。我想到的是:。。。1) 我得到每天收入的总和,并在这些数据中写一个默认值为“实际”的新的第三列。2) 我加上迄今为止的平均每日收入,并将结果写在该月剩余日期的每一行中。以及所述第三列中的默认值“FORECAST”。现在我被困在如何重复每一行的预测值上。有没有办法更新整行而不仅仅是收入值?我还需要更新/更改日期和类型。当然,只要阅读更多有关更新的文档,您就会看到语法。同时考虑接受答案。如果您有新的/更多问题,请在new postAlright中发布,谢谢。我刚刚在一篇新帖子中提出了关于这个问题的进一步问题,但你关闭了它,引用了这个帖子,不幸的是,这并没有解决我的问题。我应该把它贴在这里吗?
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
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
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)