Получить последнюю запись или первую транзакцию (продажу) стандарта SQL BigQuery - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть таблица на BigQuery со следующими столбцами:

user_id visit_date  referral    transaction
1234    20180101    site2       0
1234    20180102    site3       1
1234    20180103    site2       1
4567    20180104    site4       0
4567    20180105    site5       0
5678    20180101    site2       0
5768    20180102    site3       1

Моя цель - получить таблицу в следующем формате:

path                transactions
site2 > site3       2 
site2               1
site4 > site5       0

Чего я не понимаю, так это как «сбросить» путь для пользователя, у которого есть несколько преобразований за один и тот же период, как в случае user_id = 1234.

Пока мне удается использовать следующий запрос, но он не является желаемым результатом.

SELECT
  referral_path,
  SUM(transactions) AS transactions
FROM (
  SELECT
  user_id,
  STRING_AGG(DISTINCT(referral), ',') AS referral_path,
  MAX(transactions) AS transactions
  FROM (
     SELECT
     user_id,
     referral,
     transactions
  FROM
     table
  ORDER BY
     user_id )a
  GROUP BY
     user_id )b
  GROUP BY
     referral_path
  ORDER BY
      transactions DESC

1 Ответ

0 голосов
/ 09 ноября 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  path, 
  SUM(transaction) transactions
FROM (
  SELECT
    STRING_AGG(referral, ' > ') path,
    SUM(transaction) transaction
  FROM (
    SELECT 
      user_id, visit_date, referral, transaction, 
      IFNULL(SUM(transaction) OVER(PARTITION BY user_id ORDER BY visit_date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) grp 
    FROM `project.dataset.table`
  )
  GROUP BY user_id, grp
)
GROUP BY path

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1234 user_id, '20180101' visit_date, 'site2' referral, 0 transaction UNION ALL
  SELECT 1234, '20180102', 'site3', 1 UNION ALL
  SELECT 1234, '20180103', 'site2', 1 UNION ALL
  SELECT 4567, '20180104', 'site4', 0 UNION ALL
  SELECT 4567, '20180105', 'site5', 0 UNION ALL
  SELECT 5678, '20180101', 'site2', 0 UNION ALL
  SELECT 5678, '20180102', 'site3', 1 
)
SELECT 
  path, 
  SUM(transaction) transactions
FROM (
  SELECT
    STRING_AGG(referral, ' > ') path,
    SUM(transaction) transaction
  FROM (
    SELECT 
      user_id, visit_date, referral, transaction, 
      IFNULL(SUM(transaction) OVER(PARTITION BY user_id ORDER BY visit_date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) grp 
    FROM `project.dataset.table`
  )
  GROUP BY user_id, grp
)
GROUP BY path
ORDER BY transactions DESC  

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

Row path            transactions     
1   site2 > site3   2    
2   site2           1    
3   site4 > site5   0    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...