SQL按行平均分配值

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

我有一行,包括开始日期、结束日期和预算。 其思想是获得从开始日期到结束日期之间的天数,以按天平均分配预算

例如:

起始日期(以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
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