[英]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;
查询结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.