Sql 在BigQuery中按比例分配
我想按比例分配一张表,如下所示: 进入如下表格: 基本上,我想为date_start和date end之间的天数创建行,然后将花费除以天数 我目前正在使用下面的查询来实现这一点,使用BigQuery脚本-我知道这可能是一种可怕的查询方式,但我不确定其他方法如何实现。仅对3行运行此查询大约需要30秒Sql 在BigQuery中按比例分配,sql,google-bigquery,Sql,Google Bigquery,我想按比例分配一张表,如下所示: 进入如下表格: 基本上,我想为date_start和date end之间的天数创建行,然后将花费除以天数 我目前正在使用下面的查询来实现这一点,使用BigQuery脚本-我知道这可能是一种可怕的查询方式,但我不确定其他方法如何实现。仅对3行运行此查询大约需要30秒 DECLARE i INT64 DEFAULT 1; DECLARE n int64; SET n = (SELECT COUNT(*) FROM `pro_rata_test.data`);
DECLARE i INT64 DEFAULT 1;
DECLARE n int64;
SET n = (SELECT COUNT(*) FROM `pro_rata_test.data`);
DELETE FROM `pro_rata_test.pro_rata` WHERE TRUE;
WHILE i <= n DO
INSERT INTO
pro_rata_test.pro_rata
SELECT
day,
country,
campaign,
other,
SUM(spend)/(
SELECT
DATETIME_DIFF(DATETIME(TIMESTAMP(date_end)),
DATETIME(TIMESTAMP(date_start)),
DAY) + 1
FROM (
SELECT *, ROW_NUMBER() OVER(ORDER BY date_start) AS rn FROM `pro_rata_test.data`)
WHERE
rn = i) AS spend
FROM (
SELECT *, ROW_NUMBER() OVER(ORDER BY date_start) AS rn FROM `pro_rata_test.data`),
UNNEST(GENERATE_DATE_ARRAY(date_start, date_end)) day
WHERE
rn = i
GROUP BY
day,
country,
campaign,
other
ORDER BY
day;
SET
i = i + 1;
END WHILE
尝试生成\u日期\u数组并取消测试:
with mytable as (
select date '2021-01-01' as date_start, date '2021-01-10' as date_end, 100 as spend, 'FR' as country, 'Campaign1' as campaign, 'test1' as Other union all
select date '2021-01-11', date '2021-02-27', 150, 'UK', 'Campaign1', 'test2' union all
select date '2021-03-20', date '2021-04-20', 500, 'UK', 'Campaign2', 'test2'
)
select
day,
country,
campaign,
other,
spend/(date_diff(date_end, date_start, day)+1) as spend
from mytable, unnest(generate_date_array(date_start, date_end)) as day
order by day