在GBQ中创建和循环日期数组

Posted

技术标签:

【中文标题】在GBQ中创建和循环日期数组【英文标题】:Creating and looping through date array in GBQ 【发布时间】:2021-12-02 09:57:44 【问题描述】:

我需要将月末日期创建为一个数组,然后循环它们以计算月末的每个 skuid 数量(还需要将每个 eom 信息合并到一个表中,但这将是另一个问题),从 2021-01-31 开始。 试过这个查询(创建 eom 数组 --> 然后在 for 循环中取消嵌套它们 --> 使用每个日期来过滤现有数据集),但它不起作用,可能是哪里出了问题?

DECLARE eom_ranges ARRAY<DATE>;
SET eom_ranges =   (SELECT ARRAY_AGG(LAST_DAY(dt, MONTH)) AS eoms 
                    FROM UNNEST(GENERATE_DATE_ARRAY('2021-01-01',CURRENT_DATE(), INTERVAL 1 MONTH)) AS dt);

FOR field IN
  (SELECT * from UNNEST(eom_ranges) AS `date`)
DO
    SELECT
        field AS extraction_date
        , wrh.sku_id
        , SUM(wrh.amount) AS invoiced_quantity
    FROM `xxx.xxx.warehouse` as wrh
    WHERE wrh.modified_date <= field
    GROUP BY 1,2
    HAVING invoiced_quantity <> 0;
END FOR;

【问题讨论】:

当我尝试运行这段代码,使用虚构的数据时,我遇到了有子句的错误。它与您遇到的错误相同吗?一些样本数据将有利于案例。另外,它必须是一个数组?我认为,可以通过选择来完成。 我的错,改变了有条款。我想它应该是数组,因为我可以用 eom 日期范围初始化数组,然后遍历这个数组 【参考方案1】:

我认为下面应该适合您的计算。

with valid_days as (
SELECT dt as first_day_val,
LAST_DAY(dt, MONTH) as last_day_val
FROM UNNEST(GENERATE_DATE_ARRAY( '2021-01-01',CURRENT_DATE(), INTERVAL 1 MONTH)) as dt
)
select 
  last_day_val,
  sku_id, 
  sum(amount) as invoiced_quantity
from `my-project-id.my-dataset.my-table` wrh
inner join valid_days vd on modified_date >= vd.first_day_val and modified_date <= vd.last_day_val
where amount <> 0
GROUP BY 1,2
order by 1

在这里您可以找到有关with 子句的更多信息。

【讨论】:

以上是关于在GBQ中创建和循环日期数组的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用使用手表循环遍历数组的可用时间?

如何在 Firestore 中创建和更新数字数组?

如何在jquery中创建和访问数组

在C ++中创建和使用动态数组

从Unix时间戳日期ios数组在Uitableview中创建动态部分?

有没有办法在 dart 中使用 JsonSerializable 创建 JsonKey 动态,我们可以从 JsonSerializable 类中创建和获取数组吗?