Sql 使用预测数据继续现有表格,直到月底,并每天更新

Sql 使用预测数据继续现有表格,直到月底,并每天更新,sql,google-bigquery,forecasting,Sql,Google Bigquery,Forecasting,我想用现有的每日收入数据在Google Big Query中创建一个新表,并用预测数据扩展这个新表,预测数据基于现有数据,需要创建。一旦某一天存在新的实际数据,它将覆盖该天的预测数据。此外,直到月底的预测数据将再次更新 到目前为止,我提出了以下内容,它生成了一条错误消息:标量子查询生成了多个元素 SELECT date, sum(yl_revenue), 'ACTUAL' as type from project.dataset.table

我想用现有的每日收入数据在Google Big Query中创建一个新表,并用预测数据扩展这个新表,预测数据基于现有数据,需要创建。一旦某一天存在新的实际数据,它将覆盖该天的预测数据。此外,直到月底的预测数据将再次更新

到目前为止,我提出了以下内容,它生成了一条错误消息
标量子查询生成了多个元素

    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)