Bigquery mysql для корректировки дат активных дней недели - PullRequest
0 голосов
/ 24 февраля 2019

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

Запрос, используемый для получения этих данных (благодаря Михаил ):

#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

Упрощенный результат выглядит следующим образом (ограничено 1 местоположением):

date        revenue     revenue_last_year
2019-01-31  1471,2577   2185,406
2019-01-30  1291,1111   4723,7439
2019-01-29  2178,6532   2263,5283
2019-01-28  1531,8021   0
2019-01-26  1578,1247   2446,6234
2019-01-25  1299,644    1522,4537
2019-01-24  788,2669    1979,104
2019-01-23  787,441     4117,7927
2019-01-22  2437,2951   1876,2479
2019-01-21  1071,0476   0
2019-01-19  2291,0456   2289,8657

Следующий вопрос относится к работе с рабочими днями прошлого года.Как вы можете видеть, выручка за прошлый год имеет значения «0».Это потому, что это день, когда место А было закрыто.Однако для точного сравнения изо дня в день нам нужно найти доход за день, когда этот доход был открыт.

Для получения дополнительной информации, посмотрите на эту таблицу ниже, чтобы увидеть, как это выглядит, когда мы берем последние 10 дней января этого года и добавляем два столбца с доходами прошлого года, найденными вручную:

date        revenue     revenue_last_year   date        revenue
2019-01-31  1471,2577   2185,406            2018-01-31  2185,406
2019-01-30  1291,1111   4723,7439           2018-01-30  4723,7439
2019-01-29  2178,6532   2263,5283           2018-01-29  2263,5283
2019-01-28  1531,8021   0                   2018-01-27  2843,6616
2019-01-26  1578,1247   2446,6234           2018-01-26  2446,6234
2019-01-25  1299,644    1522,4537           2018-01-25  1522,4537
2019-01-24  788,2669    1979,104            2018-01-24  1979,104
2019-01-23  787,441     4117,7927           2018-01-23  4117,7927
2019-01-22  2437,2951   1876,2479           2018-01-22  1876,2479
2019-01-21  1071,0476   0                   2018-01-20  2561,4086
2019-01-19  2291,0456   2289,8657           2018-01-19  2289,8657

Обратите внимание на различия в датах.

Что было бы хорошим способом решить эту проблему?Нужно ли было бы подстраиваться под запрос по рабочим дням и как бы вы подошли к этому?

1 Ответ

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

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  a.date, a.location, ANY_VALUE(a.revenue) revenue, 
  ARRAY_AGG(
    STRUCT(b.date AS date_last_year, b.revenue AS revenue_last_year) 
    ORDER BY b.date DESC LIMIT 1
  )[OFFSET(0)].*
FROM `project.dataset.table` a
CROSS JOIN `project.dataset.table` b
WHERE a.location = b.location
AND b.date BETWEEN DATE_SUB(DATE_SUB(a.date, INTERVAL 1 YEAR), INTERVAL 7 DAY) AND DATE_SUB(a.date, INTERVAL 1 YEAR)
GROUP BY a.date, a.location

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2018-02-20' `date`, 'A' location, 1 revenue UNION ALL
  SELECT '2018-02-21', 'A', 3 UNION ALL
  SELECT '2019-02-20', 'A', 5 UNION ALL
  SELECT '2019-02-21', 'A', 7 UNION ALL
  SELECT '2019-02-22', 'A', 9 UNION ALL
  SELECT '2018-02-20', 'B', 2 UNION ALL
  SELECT '2018-02-22', 'B', 4 UNION ALL
  SELECT '2019-02-20', 'B', 6 UNION ALL
  SELECT '2019-02-21', 'B', 8 UNION ALL
  SELECT '2019-02-22', 'B', 10 
)
SELECT 
  a.date, a.location, ANY_VALUE(a.revenue) revenue, 
  ARRAY_AGG(
    STRUCT(b.date AS date_last_year, b.revenue AS revenue_last_year) 
    ORDER BY b.date DESC LIMIT 1
  )[OFFSET(0)].*
FROM `project.dataset.table` a
CROSS JOIN `project.dataset.table` b
WHERE a.location = b.location
AND b.date BETWEEN DATE_SUB(DATE_SUB(a.date, INTERVAL 1 YEAR), INTERVAL 7 DAY) AND DATE_SUB(a.date, INTERVAL 1 YEAR)
GROUP BY a.date, a.location
-- ORDER BY a.date, a.location    

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

Row date        location    revenue date_last_year  revenue_last_year    
1   2019-02-20  A           5       2018-02-20      1    
2   2019-02-20  B           6       2018-02-20      2    
3   2019-02-21  A           7       2018-02-21      3    
4   2019-02-21  B           8       2018-02-20      2    
5   2019-02-22  A           9       2018-02-21      3    
6   2019-02-22  B           10      2018-02-22      4       

Обратите внимание на разницу в датах: o)

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