当前位置: 首页 > 面试题库 >

继续使用现有表,直到月底为止包含预测数据并每天更新

漆雕成弘
2023-03-14
问题内容

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

到目前为止,我想出了以下内容,它会生成一条 错误消息Scalar subquery produced more than oneelement

    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 |
+------------+------------+----------+

在第二天(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 |
+------------+--------------+----------+

预测值只是该月的实际收入之和除以该月到目前为止的天数。请注意,第二个表中的每日预测值已更改,因为已将新的实际值添加到该表中。

非常感谢您提供有关如何解决此问题的帮助!

谢谢

一月


问题答案:

我找到了解决问题的方法。(尽管它可能不是最复杂的一种)

我现在想出了3个新表:

  1. 提供过去和将来的日期,这就是为什么我称其为“日历”
  2. 提供当月的收入数据。我每天都使用计划查询覆盖该表,该查询提供了实际的过去数据和预测的未来数据(基于当月的实际数据),直到当前月末。
  3. 提供过去的数据(回溯的时间比当月还长),再加上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)


 类似资料:
  • 问题内容: 怎么可能 等到动作完成后再继续循环,我不能得到$ this var,因为它具有最后一个值,对不起我的英语,谢谢!!! 问题答案: 选项1:切换到处理程序中数组中的下一个元素。 选项2:同步发出Ajax请求: 全球: 或直接在请求中: });

  • 目标: 需要向现有的Debezium MySQL连接器版本1.1.1添加一个新表。最终的连接器重新启动后,应使用更新的配置(table.whitelist中的新表)将表中的数据填充到主题中。 问题: 没有明确的策略来添加一个新表,该表将在初始快照完成后(连接器的前一个版本正在工作)与其数据一起添加到Kafka中。我们正在寻找类似于snapshot.select.statement.override

  • 我必须找出两个日期在月和天之间的区别。我尝试了谷歌,但我只发现了月份和日期的差异。 例如:2013年4月1日和2013年5月7日,那么结果应该是1个月6天。 我希望代码只使用Java6提供的api。推荐但不喜欢Joda Time和其他。谢谢你的帮助。

  • Python3 实例 以下代码通过导入 calendar 模块来计算每个月的天数: # Filename : test.py # author by : www.runoob.com import calendar monthRange = calendar.monthrange(2016,9) print(monthRange) 执行以上代码输出结果为: (3, 30) 输出的是一个元

  • 我试图创建一个生日计算器,也包括几个月和几天,而不仅仅是几年。 然而,我似乎无法让它发布答案,当它发布时,它是不正确的。 我还在学习,所以我真的很感激任何反馈,我希望这是我忽略的简单的东西。

  • 问题内容: 我有一张表,如下所示: 我从中创建以下视图: 现在,当我想创建每月计数以了解如何将每日总和除以得出平均列a(即特定月份中的天数)时,就会出现问题。 我知道要在PostgreSQL中获得成功,您可以: 但是我不能使用,我必须以某种方式让它知道分组完成的月份。任何建议,即什么应该取代 ??? 在此视图中: 问题答案: 更快,更短一点,您得到的是天数,而不是: 可以将多个单位合并为一个值。因