Большой запрос Google - SQL Динамическое распределение значений по дням (неделям) - PullRequest
1 голос
/ 18 апреля 2020

У меня есть набор данных в Google Big Query, которым я должен манипулировать, чтобы использовать его в Data Studio. Он содержит расходы на СМИ, которые вводятся каждую среду, но их необходимо распространить на предыдущую неделю (в среду), поэтому, например, 15-го числа будет потрачено 7 тыс. Евро. Это означает, что на неделе до 8-го до 14-го; расходы составляли € 1K каждый день. Суммы меняются каждую неделю, но всегда вводятся в среду ..:

Example as-is

Example to-be

Я делал это на листах Google, где использовал с помощью функции sumif, смотрящей на будний день, и на основе этого поиска в будний день значение даты + X (например, для вторника, который будет датой +1) и делим эту сумму на 7.

Теперь я хотел бы сделайте то же самое, но в SQL, и я изо всех сил пытаюсь заставить это работать. Есть ли простое решение или мне нужно создать похожую формулу, используя, например, CASE WHEN на основе дня недели?

Большое спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 18 апреля 2020

Вы можете написать запрос для этого. Если вы знаете, что у вас есть данные за каждую неделю, вам просто нужно самое последнее значение, отличное от NULL, и разделите его на 7:

select t.*,
       last_value(spend ignore nulls) over (order by date) / 7
from t;

Если у вас могут быть пропущенные даты или нулевые значения для целую неделю, тогда вышесказанное не сработает. Более общее решение идентифицирует неделю и разделы этим:

select t.*,
       max(spend) over (partition by date_trunc(date, week(Wednesday))) / 7
from t;
0 голосов
/ 18 апреля 2020

Я подготовил этот запрос, предполагая, что данные всегда вводятся в один и тот же день недели (в вашем случае, в среду), и вы хотите распределить их на предыдущие 7 дней.

WITH 
data AS (
  SELECT CAST('2020-04-08' as date) as Date, 5000 as Spend union all
  SELECT CAST('2020-04-15' as date) as Date, 7000 as Spend
)
select DATE_SUB(Date, interval n_days day) as Date, Spend/7 as spend
from data
join unnest(generate_array(1, 7)) as n_days

Таким образом, ввод довольно просто, только по средам.

Вывод выглядит так: Query Output

0 голосов
/ 18 апреля 2020

Кажется, вам нужно что-то вроде

UPDATE sourcetable t1
SET t1.Spend = t3.Spend
FROM ( SELECT t2.Date, 
              MAX(t2.Spend) OVER (ORDER BY t2.Date 
                                  ROWS BETWEEN 1 FOLLOWING   
                                           AND 7 FOLLOWING) Spend
       FROM sourcetable t2 ) t3
WHERE t1.Date = t3.Date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...