SQL равномерно распределяет значение по строкам - PullRequest
0 голосов
/ 27 августа 2018

У меня есть одна строка с Date_Start, Date_End и Budget. Идея состоит в том, чтобы получить количество дней между Date_Start и Date_End, чтобы представить бюджет, равномерно распределенный по дням.

Пример:

происхождение (дата в гггг-мм-дд):

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.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Ниже приведен пример для BigQuery Standard 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     
0 голосов
/ 27 августа 2018

Существует решение, которое не требует хранимой процедуры, при условии, что реализация SQL поддерживает WITH. Извините, я не знаю, есть ли у 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
;

Результатом будет то, о чем вы просили, но без проверки ошибок, например, предполагается, что date_end намного опережает date_start.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...