Google bigquery 填补其他表格中瀑布的空白

Google bigquery 填补其他表格中瀑布的空白,google-bigquery,qsqlquery,waterfall,Google Bigquery,Qsqlquery,Waterfall,我有两张桌子: 1.来自预测表的原始预测数据,由快照日期提取,我使用这些数据创建的瀑布如下所示 行标签是快照日期,列标签是预测周。 基本上,数据有很多快照日期,每个快照将提供从该快照日期开始的预测数据,并在预测周中显示。第一个快照日期x的预测周数将超过x,第二个快照日期y的预测周数将仅超过y 然后我有表2,消费表中的消费数据。我将使用消费表中的周来匹配预测表中的周来插入消费,以填补瀑布中的空白 如果我在excel中手动执行,它将是预测8/25周,周数为35,然后我从消费表中找到第35周并插入

我有两张桌子:

1.来自预测表的原始预测数据,由快照日期提取,我使用这些数据创建的瀑布如下所示
行标签是快照日期,列标签是预测周。 基本上,数据有很多快照日期,每个快照将提供从该快照日期开始的预测数据,并在预测周中显示。第一个快照日期x的预测周数将超过x,第二个快照日期y的预测周数将仅超过y


然后我有表2,消费表中的消费数据。我将使用消费表中的周来匹配预测表中的周来插入消费,以填补瀑布中的空白

如果我在excel中手动执行,它将是预测8/25周,周数为35,然后我从消费表中找到第35周并插入此处。因此,所有快照的第35周日期都是相同的

它将如下所示:
但这里的问题是在我的预测表中,例如,第一个快照日期将具有第1周到第10周的预测,但第二个快照日期将仅具有第2周到第10周的预测。 我不知道如何以及是否有可能使这个过程自动化BigQuerySQL,因为空格基本上意味着没有数据,没有预测周

如果有人能给我一些建议,我将不胜感激

这是我的剧本:

 //Get item info from forecast table
DEFINE INLINE TABLE t1
SELECT CONCAT(SUBSTR(snapshot_date, -4, 4),'-',SUBSTR(snapshot_date, -10, 2),'-', SUBSTR(snapshot_date, -7, 2)) snapshot, 
item_name, 
type, 
item_description, 
CONCAT(SUBSTR(forecast_week_start_date, -4, 4),'-',SUBSTR(forecast_week_start_date, -10, 2),'-', SUBSTR(forecast_week_start_date, -7, 2)) forecast_week_start_date, 
SUM(quantity) qty, 
forecast_week_number, 
forecast_year_number,
CONCAT(STRING(forecast_year_number),'-',STRING(forecast_week_number) year_week
FROM forecast
WHERE 
concat(SUBSTR(snapshot_date, -4, 4),'-',SUBSTR(snapshot_date, -10, 2),'-', SUBSTR(snapshot_date, -7, 2)) >= 
strftime_usec(date_add(TIME_USEC_TO_WEEK(date_add(now(),-84 ,'DAY'),1),-1,'DAY'),'%Y-%m-%d')
GROUP BY snapshot, 
item_name, 
type, 
item_description, 
forecast_week_start_date, 
forecast_week_number, 
forecast_year_number,
year_week
ORDER BY sdm_week_start_date

//Get min year_week to use later
DEFINE INLINE TABLE t2
SELECT MIN(year_week) min_year_week
FROM t1


//Get consumption data and apply using dc deploy week
SELECT 
snapshot, 
item_name, 
type, 
item_description, 
forecast_week_start_date, 
qty,
forecast_week_number, 
forecast_year_number,
year_week
IF(t2.min_year_week!= year_week, qty+ABS(consumption_qty),qty)) quantity,

FROM t1
LEFT JOIN ALL 
 (SELECT item_name, week,sum(transaction_quantity) consumption_qt
  FROM consumption 
  GROUP BY item_name,week) inv
ON t1.year_week=inv.week AND t1.item_name=inv.item_name
CROSS JOIN t2

我试了一下

这两个查询生成具有示例中的值的表。假设 第一个查询的输出将写入消费表

SELECT *
FROM
  (SELECT 123 AS item, '8/25/14' AS date, 2222 AS quantity),
  (SELECT 123 AS item, '9/1/14' AS date, 333 AS quantity),
  (SELECT 123 AS item, '9/8/14' AS date, 444 AS quantity),
  (SELECT 123 AS item, '9/15/14' AS date, 0 AS quantity);
SELECT *
FROM
  (SELECT 123 AS item, '8/24/14' AS snapshot, '8/25/14' AS forecast, 7661 AS quantity),
  (SELECT 123 AS item, '8/24/14' AS snapshot, '9/1/14' AS forecast, 4980 AS quantity),
  (SELECT 123 AS item, '8/24/14' AS snapshot, '9/8/14' AS forecast, 588 AS quantity),
  (SELECT 123 AS item, '8/24/14' AS snapshot, '9/15/14' AS forecast, 2232 AS quantity),
  (SELECT 123 AS item, '8/31/14' AS snapshot, '9/1/14' AS forecast, 8319 AS quantity),
  (SELECT 123 AS item, '8/31/14' AS snapshot, '9/8/14' AS forecast, 1968 AS quantity),
  (SELECT 123 AS item, '8/31/14' AS snapshot, '9/15/14' AS forecast, 2760 AS quantity),
  (SELECT 123 AS item, '9/7/14' AS snapshot, '9/8/14' AS forecast, 6931 AS quantity),
  (SELECT 123 AS item, '9/7/14' AS snapshot, '9/15/14' AS forecast, 684 AS quantity),
  (SELECT 123 AS item, '9/14/14' AS snapshot, '9/15/14' AS forecast, 9328 AS quantity);
第二个查询的输出被写入预测表

SELECT *
FROM
  (SELECT 123 AS item, '8/25/14' AS date, 2222 AS quantity),
  (SELECT 123 AS item, '9/1/14' AS date, 333 AS quantity),
  (SELECT 123 AS item, '9/8/14' AS date, 444 AS quantity),
  (SELECT 123 AS item, '9/15/14' AS date, 0 AS quantity);
SELECT *
FROM
  (SELECT 123 AS item, '8/24/14' AS snapshot, '8/25/14' AS forecast, 7661 AS quantity),
  (SELECT 123 AS item, '8/24/14' AS snapshot, '9/1/14' AS forecast, 4980 AS quantity),
  (SELECT 123 AS item, '8/24/14' AS snapshot, '9/8/14' AS forecast, 588 AS quantity),
  (SELECT 123 AS item, '8/24/14' AS snapshot, '9/15/14' AS forecast, 2232 AS quantity),
  (SELECT 123 AS item, '8/31/14' AS snapshot, '9/1/14' AS forecast, 8319 AS quantity),
  (SELECT 123 AS item, '8/31/14' AS snapshot, '9/8/14' AS forecast, 1968 AS quantity),
  (SELECT 123 AS item, '8/31/14' AS snapshot, '9/15/14' AS forecast, 2760 AS quantity),
  (SELECT 123 AS item, '9/7/14' AS snapshot, '9/8/14' AS forecast, 6931 AS quantity),
  (SELECT 123 AS item, '9/7/14' AS snapshot, '9/15/14' AS forecast, 684 AS quantity),
  (SELECT 123 AS item, '9/14/14' AS snapshot, '9/15/14' AS forecast, 9328 AS quantity);
然后,以下查询生成类似于所需的内容:

SELECT
    Consumed.item AS item,
    Consumed.snapshot AS snapshot,
    Consumed.date AS date,
    IF (Forecast.quantity IS NULL, Consumed.quantity, Forecast.quantity) AS quantity
FROM
    (SELECT
        C.item     AS item,
        S.snapshot AS snapshot,
        C.date     AS date,
        C.quantity AS quantity
     FROM
        (SELECT *
         FROM
            (SELECT '8/24/14' AS snapshot),
            (SELECT '8/31/14' AS snapshot),
            (SELECT '9/7/14' AS snapshot),
            (SELECT '9/14/14' AS snapshot)) AS S
     CROSS JOIN
        consumption_table AS C) AS Consumed
LEFT JOIN
    forecast_table AS Forecast
ON Consumed.item = Forecast.item AND 
   Consumed.snapshot = Forecast.snapshot AND
   Consumed.date = Forecast.forecast;

此查询的关键是交叉联接生成所有所需的输出行,其中包含已消耗的数量。然后,左连接保留所有这些行,并在预测数量可用时选择预测数量。

如果您可以在BigQuery中创建这些表,然后与我们共享此示例数据集,将非常有帮助。然后其他读者和我可以开始玩查询来解决这个问题。CCA您是否可以包括您迄今为止尝试过的查询?我已经更新了脚本,我意识到它不起作用,因为在我的预测表中,只有第一个快照日期包含所有预测周,因此,当我添加消费数据时,我不会为其他快照日期添加缺失的预测周,我想添加到这些快照日期。我不确定创建一个虚拟表是否有用,甚至不知道如何创建。谢谢。您好,谢谢您的回答,但在我的情况下,快照和预测日期并不“已知”,我使用了一个查询来提取快照日期(比如从现在起的12周),每个快照日期将有一组预测日期。因此,我不知道如何才能做到这一点。您可以将生成S的子查询替换为实际表上按顺序生成所有快照日期的子查询,例如,按快照顺序从表组中选择快照。