繁体   English   中英

BigQuery:将每月数据拆分为几天

[英]BigQuery: Split monthly data into days

我想从现有数据创建一个新表:

日期 店铺 成本
2022-01-10 一种 3000
2022-01-10 b 2500

最后目标表应该是这样的:

日期 店铺 成本
2022-01-10 一种 96,77
2022-02-10 一种 96,77
2022-03-10 一种 96,77
2022-04-10 一种 96,77
....到本月的最后一天 一种 96,77
2022-01-10 b 80,65
2022-02-10 b 80,65
2022-03-10 b 80,65
... b 80,65

该查询应插入到另一个 bigquery 表中,其中包含每个月的每一天的新行(如第二个表)。 成本应除以每月的日期以分摊成本。

我尝试了一些查询,但找不到解决方案::(

谢谢!

在这里使用这个答案,我计算了每个月的天数,然后我用它除以每月成本得到daily_avg_monthly_cost 然后我加入了一个数组生成的表,其中包含一年中每个月的所有日期,并得到了最终的 output。

请注意:此解决方案的局限性在于值“2022”是硬编码的。

WITH source_data as (
    SELECT date('2022-01-10') as _month, 'a' as store, 3000 as cost
    UNION ALL
    SELECT date('2022-01-10') as _month, 'b' as store, 2500 as cost
    UNION ALL
    SELECT date('2022-02-10') as _month, 'a' as store, 4000 as cost
    UNION ALL
    SELECT date('2022-02-10') as _month, 'b' as store, 3500 as cost
 ), cost_table AS (
        SELECT
            FORMAT_DATE('%Y-%m', _month) AS month,
            store,
            cost/EXTRACT(DAY FROM (DATE_SUB(DATE_TRUNC(DATE_ADD(_month, INTERVAL 1 MONTH), MONTH),INTERVAL 1 DAY))) daily_avg_monthly_cost
        FROM source_data
),days AS (
        SELECT
            d, 
            FORMAT_DATE('%Y-%m',d) AS month
            FROM (
                SELECT 
                    *
                FROM
                UNNEST(GENERATE_DATE_ARRAY('2022-01-01', '2022-12-31', INTERVAL 1 DAY)) AS d 
            )
)
    SELECT
        days.d as date,
        cost_table.store,
        cost_table.daily_avg_monthly_cost
    FROM cost_table
    JOIN days ON CAST(cost_table.month AS STRING) = days.month

您也可以考虑以下内容。

WITH sample_table AS (
  SELECT '2022-01-10' date, 'a' store, 3000 cost UNION ALL
  SELECT '2022-01-10' date, 'b' store, 2500 cost
)
SELECT store, date, ROUND(cost / COUNT(1) OVER (PARTITION BY store, _date), 2) cost 
  FROM (
    SELECT store, cost,
           -- parse *date* STRING to DATE type
           PARSE_DATE('%Y-%d-%m', date) AS _date,
      FROM sample_table
  ), UNNEST(GENERATE_DATE_ARRAY(DATE_TRUNC(_date, MONTH), LAST_DAY(_date))) date;
  • LAST_DAY :从日期表达式返回最后一天。 这通常用于返回该月的最后一天。

查询结果

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM