Скользящие 30 дней данных из Big Query - PullRequest
0 голосов
/ 06 сентября 2018

Предположим, у меня есть этот запрос:

SELECT ga_channelGrouping, ga_sourceMedium,ga_campaign, SUM(ga_sessions) as sessions,
SUM(ga_sessionDuration)/SUM(ga_sessions) as avg_sessionDuration, 
SUM(ga_users)as Users, SUM(ga_newUsers)as New_Users, SUM(ga_bounces)/SUM(ga_sessions) 
AS ga_bounceRate, SUM(ga_pageviews)/SUM(ga_sessions)as pageViews_per_sessions, 
SUM( ga_transactions)/SUM(ga_sessions) AS ga_conversionRate 


FROM db.table 

group by ga_channelGrouping, ga_sourceMedium,ga_campaign

Как найти скользящие 30-дневные данные из Big Query. Мой столбец DATE имеет следующий формат: 2018-06-19 11:00:00 UTC

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Как найти 30-дневные данные из Big Query. Значение моего столбца DATE имеет следующий формат: 2018-06-19 11:00:00 UTC

Во-первых, я хотел бы отметить, что aggregating last 30 days совершенно отличается от rolling 30 days - поэтому нижеприведенный ответ на самом деле фокусируется на rolling 30 days против just last 30 days

Ниже для стандартного SQL BigQuery и предполагает, что ваш столбец даты называется your_date_column и имеет тип данных TIMESTAMP

#standardSQL
SELECT 
  your_date_column, -- data type of TIMESTAMP with value like 2018-06-19 11:00:00 UTC
  ga_channelGrouping, 
  ga_sourceMedium,
  ga_campaign, 
  SUM(ga_sessions) OVER(win) AS sessions,
  (SUM(ga_sessionDuration) OVER(win))/(SUM(ga_sessions) OVER(win)) AS avg_sessionDuration, 
  SUM(ga_users) OVER(win) AS Users, 
  SUM(ga_newUsers) OVER(win) AS New_Users, 
  (SUM(ga_bounces) OVER(win))/(SUM(ga_sessions) OVER(win)) AS ga_bounceRate, 
  (SUM(ga_pageviews) OVER(win))/(SUM(ga_sessions) OVER(win)) AS pageViews_per_sessions, 
  (SUM(ga_transactions) OVER(win))/(SUM(ga_sessions) OVER(win)) AS ga_conversionRate 
FROM `project.dataset.table`
WINDOW win AS (
  PARTITION BY ga_channelGrouping, ga_sourceMedium, ga_campaign
  ORDER BY UNIX_DATE(DATE(your_date_column)) 
  RANGE BETWEEN 29 PRECEDING AND CURRENT ROW
)    

Чтобы вы поняли, как это работает - попробуйте поиграть с приведенным ниже фиктивным примером (для простоты он работает 3 дней)

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 value, TIMESTAMP '2018-06-19 11:00:00 UTC' your_date_column UNION ALL
  SELECT 2, '2018-06-20 11:00:00 UTC' UNION ALL
  SELECT 3, '2018-06-21 11:00:00 UTC' UNION ALL
  SELECT 4, '2018-06-22 11:00:00 UTC' UNION ALL
  SELECT 5, '2018-06-23 11:00:00 UTC' UNION ALL
  SELECT 6, '2018-06-24 11:00:00 UTC' UNION ALL
  SELECT 7, '2018-06-25 11:00:00 UTC' UNION ALL
  SELECT 8, '2018-06-26 11:00:00 UTC' UNION ALL
  SELECT 9, '2018-06-27 11:00:00 UTC' UNION ALL
  SELECT 10, '2018-06-28 11:00:00 UTC' 
)
SELECT 
  your_date_column, 
  value, 
  SUM(value) OVER(win) rolling_value
FROM `project.dataset.table`
WINDOW win AS (ORDER BY UNIX_DATE(DATE(your_date_column)) RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
ORDER BY your_date_column   

где результат

Row your_date_column        value   rolling_value    
1   2018-06-19 11:00:00 UTC 1       1    
2   2018-06-20 11:00:00 UTC 2       3    
3   2018-06-21 11:00:00 UTC 3       6    
4   2018-06-22 11:00:00 UTC 4       9    
5   2018-06-23 11:00:00 UTC 5       12   
6   2018-06-24 11:00:00 UTC 6       15   
7   2018-06-25 11:00:00 UTC 7       18   
8   2018-06-26 11:00:00 UTC 8       21   
9   2018-06-27 11:00:00 UTC 9       24   
10  2018-06-28 11:00:00 UTC 10      27   
0 голосов
/ 06 сентября 2018

Вы можете использовать функции DATE_ADD или DATE_SUB для смещения значений даты и TIMESTAMP_ADD, TIMESTAMP_SUB для смещения значений меток времени.

Так что вы можете попробовать:

SELECT ga_channelGrouping, ga_sourceMedium,ga_campaign, SUM(ga_sessions) as sessions,
SUM(ga_sessionDuration)/SUM(ga_sessions) as avg_sessionDuration, 
SUM(ga_users)as Users, SUM(ga_newUsers)as New_Users, SUM(ga_bounces)/SUM(ga_sessions) 
AS ga_bounceRate, SUM(ga_pageviews)/SUM(ga_sessions)as pageViews_per_sessions, 
SUM( ga_transactions)/SUM(ga_sessions) AS ga_conversionRate 


FROM db.table 

WHERE your_date_column >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24*30 HOUR)

group by ga_channelGrouping, ga_sourceMedium,ga_campaign

TIMESTAMP_SUB не принимает DAY в качестве интервала, поэтому здесь мы сделали 24*30 часов, чтобы вернуться назад на 30 дней.


РЕДАКТИРОВАТЬ : Если вы хотите откатиться на 30 дней независимо от времени дня, вы можете сделать следующее:

WHERE your_date_column >= TIMESTAMP_TRUNC(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24*30 HOUR), DAY)

OR

WHERE CAST(your_date_column AS DATE) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...