Значения ведущих столбцов таблицы Bigquery на основе даты - PullRequest
0 голосов
/ 23 февраля 2019

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

Я использовал DATE_ADD, чтобы создать новый столбец, чтобы получить дату прошлого года, но теперь я хочу получить столбецрядом с ним выручка, основанная на дате DATE_ADD.

Одна проблема заключается в том, что не во всех местоположениях указана одна и та же дата, поэтому сдвиг сделать сложнее.

Нет способа правильно отформатировать таблицу, поэтому у меня есть изображение ожидаемого результата здесь.Где, по сути, поле year_last_year должно заполняться значением столбца дохода, соответствующего столбцу date_add и правильному расположению.

enter image description here

Ниже приведен запроснасколько мне удалось пройти:

SELECT  
Date, 
location, 
revenue,
DATE_ADD(date, INTERVAL -1 YEAR) AS DateAdd,
LEAD(revenue, ##OFFSET## ) OVER (PARTITION BY location ORDER BY date DESC) AS revenue_last_year
FROM
`dataset.table1`

Есть ли у кого-нибудь предложения о том, как соотнести значение смещения с правильной датой?Или я должен подойти к этому совершенно по-другому?

1 Ответ

0 голосов
/ 23 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  a.date, a.location, a.revenue, 
  DATE_SUB(a.date, INTERVAL 1 YEAR) date_last_year, 
  IFNULL(b.revenue, 0) revenue_last_year 
FROM `project.dataset.table` a
LEFT JOIN `project.dataset.table` b
ON a.location = b.location
AND DATE_SUB(a.date, INTERVAL 1 YEAR) = b.date

Вы можете протестировать, поиграть с выше, используя фиктивные данные, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2018-02-20' `date`, 'A' location, 1 revenue UNION ALL
  SELECT '2018-02-20', 'B', 2 UNION ALL
  SELECT '2018-02-21', 'A', 3 UNION ALL
  SELECT '2018-02-22', 'B', 4 UNION ALL
  SELECT '2019-02-20', 'A', 5 UNION ALL
  SELECT '2019-02-20', 'B', 6 UNION ALL
  SELECT '2019-02-21', 'A', 7 UNION ALL
  SELECT '2019-02-21', 'B', 8 UNION ALL
  SELECT '2019-02-22', 'A', 9 UNION ALL
  SELECT '2019-02-22', 'B', 10 
)
SELECT 
  a.date, a.location, a.revenue, 
  DATE_SUB(a.date, INTERVAL 1 YEAR) date_last_year, 
  IFNULL(b.revenue, 0) revenue_last_year 
FROM `project.dataset.table` a
LEFT JOIN `project.dataset.table` b
ON a.location = b.location
AND DATE_SUB(a.date, INTERVAL 1 YEAR) = b.date
-- ORDER BY a.date, a.location  

с результатом

Row date        location    revenue date_last_year  revenue_last_year    
1   2018-02-20  A           1       2017-02-20      0
2   2018-02-20  B           2       2017-02-20      0
3   2018-02-21  A           3       2017-02-21      0
4   2018-02-22  B           4       2017-02-22      0
5   2019-02-20  A           5       2018-02-20      1    
6   2019-02-20  B           6       2018-02-20      2    
7   2019-02-21  A           7       2018-02-21      3    
8   2019-02-21  B           8       2018-02-21      0
9   2019-02-22  A           9       2018-02-22      0
10  2019-02-22  B           10      2018-02-22      4    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...