SQL按行平均分配值
我有一行,包括开始日期、结束日期和预算。 其思想是获得从开始日期到结束日期之间的天数,以按天平均分配预算 例如: 起始日期(以yyyy-mm-dd为单位):SQL按行平均分配值,sql,google-bigquery,Sql,Google Bigquery,我有一行,包括开始日期、结束日期和预算。 其思想是获得从开始日期到结束日期之间的天数,以按天平均分配预算 例如: 起始日期(以yyyy-mm-dd为单位): Date_Start,Date_End,budget 2018-04-01,2018-04-10, 300 结果表明: day, budget 2018-04-01, 30 2018-04-02, 30 2018-04-03, 30 2018-04-04, 30 2018-04-05, 30 2018-04-06, 30
Date_Start,Date_End,budget
2018-04-01,2018-04-10, 300
结果表明:
day, budget
2018-04-01, 30
2018-04-02, 30
2018-04-03, 30
2018-04-04, 30
2018-04-05, 30
2018-04-06, 30
2018-04-07, 30
2018-04-08, 30
2018-04-09, 30
2018-04-10, 30
你知道怎么用SQL来做吗?我专门使用BigQuery。有一种解决方案不需要存储过程,只要SQL实现支持。 对不起,我不知道BigQuery是否有这样的支持,但我可以用MariaDB 10.3.9来说明
CREATE TABLE t (date_start DATE, date_end DATE, budget DECIMAL(10));
INSERT INTO t VALUES (DATE '2018-04-01', DATE '2018-04-10', 300);
with recursive mydates (cdate,nextdate,b) as (
select date_start AS cdate, date_end AS nextdate, budget/((date_end+1)-date_start) AS b from t
union all
select cdate+1, nextdate, b
from mydates
where cdate < nextdate
)
SELECT cdate,b from mydates
;
结果将是您要求的结果,但没有错误检查,例如,它假定日期结束早于日期开始。有一种解决方案不需要存储过程,只要SQL实现支持。 对不起,我不知道BigQuery是否有这样的支持,但我可以用MariaDB 10.3.9来说明
CREATE TABLE t (date_start DATE, date_end DATE, budget DECIMAL(10));
INSERT INTO t VALUES (DATE '2018-04-01', DATE '2018-04-10', 300);
with recursive mydates (cdate,nextdate,b) as (
select date_start AS cdate, date_end AS nextdate, budget/((date_end+1)-date_start) AS b from t
union all
select cdate+1, nextdate, b
from mydates
where cdate < nextdate
)
SELECT cdate,b from mydates
;
结果将是您要求的结果,但没有错误检查,例如,它假定日期结束时间远远早于日期开始时间。下面是BigQuery标准SQL的示例
#standardSQL
WITH `project.dataset.table` AS (
SELECT DATE '2018-04-01' Date_Start, DATE '2018-04-10' Date_End, 300 budget
)
SELECT day, budget / (1 + DATE_DIFF(Date_End, Date_Start, DAY)) budget
FROM `project.dataset.table`,
UNNEST(GENERATE_DATE_ARRAY(Date_Start, Date_End)) day
结果:
Row day budget
1 2018-04-01 30.0
2 2018-04-02 30.0
3 2018-04-03 30.0
4 2018-04-04 30.0
5 2018-04-05 30.0
6 2018-04-06 30.0
7 2018-04-07 30.0
8 2018-04-08 30.0
9 2018-04-09 30.0
10 2018-04-10 30.0
下面是BigQuery标准SQL的示例
#standardSQL
WITH `project.dataset.table` AS (
SELECT DATE '2018-04-01' Date_Start, DATE '2018-04-10' Date_End, 300 budget
)
SELECT day, budget / (1 + DATE_DIFF(Date_End, Date_Start, DAY)) budget
FROM `project.dataset.table`,
UNNEST(GENERATE_DATE_ARRAY(Date_Start, Date_End)) day
结果:
Row day budget
1 2018-04-01 30.0
2 2018-04-02 30.0
3 2018-04-03 30.0
4 2018-04-04 30.0
5 2018-04-05 30.0
6 2018-04-06 30.0
7 2018-04-07 30.0
8 2018-04-08 30.0
9 2018-04-09 30.0
10 2018-04-10 30.0