Рейтинг посещений по отметке времени в StandardSQL - PullRequest
0 голосов
/ 09 мая 2018

Я веду журнал взаимодействия пользователей с веб-сайтом, поэтому пока у меня есть строка за посещение, показывающая канал реферала и временную метку:

enter image description here

Я бы хотел ранжировать каждый visit_ref по дате, чтобы самые последние имели самый высокий ранг, а самые дальние - самый низкий, в пределах диапазона, который я запрашиваю.

Вот мой код с удаленным каналом, чтобы его было легче читать:

SELECT TIMESTAMP_SECONDS(visitStartTime) AS stamp, 
customDimension.value AS UserID,
CONCAT(CAST(fullVisitorId AS STRING),CAST(visitId AS STRING)) AS visit_ref,
COUNT(DISTINCT CONCAT(CAST(fullVisitorId AS STRING),CAST(visitId AS STRING))) OVER (PARTITION BY customDimension.value) AS total_visits_in_cycle,
RANK() OVER (PARTITION BY CONCAT(CAST(fullVisitorId AS STRING),CAST(visitId AS STRING)), TIMESTAMP_SECONDS(visitStartTime) ORDER BY TIMESTAMP_SECONDS(visitStartTime)) AS visitrank,
  COUNT(DISTINCT transaction.transactionid) AS orders

FROM `xxx.xxx.ga_sessions_20*` AS t
  CROSS JOIN UNNEST(hits) AS hits
  CROSS JOIN UNNEST(t.customdimensions) AS customDimension
WHERE parse_date('%y%m%d', _table_suffix) between 
DATE_sub(current_date(), interval 3 day) and
DATE_sub(current_date(), interval 1 day)
AND customDimension.index = 2
GROUP BY 1,2,3, fullVisitorId, visitid, visitStartTime
ORDER BY UserID
LIMIT 500

В этом примере по рангу всегда возвращается 1, как видно на скриншоте, как я могу получить ранг уникального visit_ref по метке времени?

Мой желаемый результат ниже, где visitrank показывает 1 против самого старого посещения и 3 против самого нового, для этого пользователя:

2   2018-05-07 08:02:30.000 UTC 00008736-01f0-4e0e-8e3b-4dc398e5b6f8    74664051693279955771525680150   3   2   Email - CRM Campaigns   0    
3   2018-05-06 21:59:20.000 UTC 00008736-01f0-4e0e-8e3b-4dc398e5b6f8    74664051693279955771525643960   3   1   Email - CRM Campaigns   0    
4   2018-05-07 05:39:15.000 UTC 00008736-01f0-4e0e-8e3b-4dc398e5b6f8    74664051693279955771525671555   3   3   Email - CRM Campaigns   0    

RANK() OVER (PARTITION BY CONCAT(CAST(fullVisitorId AS STRING),CAST(visitId AS STRING)), TIMESTAMP_SECONDS(visitStartTime) ORDER BY TIMESTAMP_SECONDS(visitStartTime)) AS visitrank,

Я работаю с Google BigQuery StandardSQL.

1 Ответ

0 голосов
/ 09 мая 2018

Окно раздела определяет подмножество записей, которые следует учитывать. Включая TIMESTAMP_SECONDS(visitStartTime), вы устанавливаете для раздела всегда 1 запись (хотя в ваших фактических данных может быть больше), и вы когда-либо видите ранг только 1.

Кроме того, мне не понятно, зачем вам нужно выполнять конкат / приведение в определении раздела, хотя, возможно, во время этого преобразования произошли некоторые существенные преобразования. Я бы использовал это:

rank() over (partition by fullVisitorId order by timestamp_seconds(visitStartTime) desc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...