Как вернуть счет за период просмотра, уникальный для нескольких полей? - PullRequest
0 голосов
/ 30 сентября 2018

Вот образец набора данных, который у меня есть (~ 10 ТБ)

+----+------------+----------+----------------+--------------+
| id | date       | campaign | campaign_start | campaign_end |
+----+------------+----------+----------------+--------------+
| 1  | 2018-01-01 | 1        | 2018-01-01     | 2018-02-03   |
+----+------------+----------+----------------+--------------+
| 1  | 2018-02-01 | 2        | 2018-02-01     | 2018-02-03   |
+----+------------+----------+----------------+--------------+
| 1  | 2018-02-02 | 2        | 2018-02-01     | 2018-02-03   |
+----+------------+----------+----------------+--------------+
| 1  | 2018-02-03 | 2        | 2018-02-01     | 2018-02-03   |
+----+------------+----------+----------------+--------------+
| 2  | 2018-01-23 | 1        | 2018-01-01     | 2018-02-03   |
+----+------------+----------+----------------+--------------+
| 2  | 2018-02-03 | 2        | 2018-02-01     | 2018-02-03   |
+----+------------+----------+----------------+--------------+

Я хочу:

Для каждой уникальной кампании + идентификатор:

  1. Получить частоту появления идентификатора в течение периода конкретной кампании
  2. Получить частоту появления идентификатора в течение переменного периода просмотра (скажем, 3 месяца) до начала кампании.Скажите "> = campaign_start + 3 месяца"
  3. Получите самую раннюю (первую) и самую последнюю (последнюю) дату в этом окне

То, что я хотел бы получить, будет:

+----+----------+--------------------+--------------------------+----------------+--------------+------------+------------+
| id | campaign | campaign_frequency | total_lookback_frequency | campaign_start | campaign_end | first_date | last_date  |
+----+----------+--------------------+--------------------------+----------------+--------------+------------+------------+
| 1  | 1        | 1                  | 1                        | 2018-01-01     | 2018-02-03   | 2018-01-01 | 2018-01-01 |
+----+----------+--------------------+--------------------------+----------------+--------------+------------+------------+
| 1  | 2        | 3                  | 4                        | 2018-02-01     | 2018-02-03   | 2018-01-01 | 2018-02-03 |
+----+----------+--------------------+--------------------------+----------------+--------------+------------+------------+
| 2  | 1        | 1                  | 1                        | 2018-01-01     | 2018-02-03   | 2018-01-23 | 2018-01-23 |
+----+----------+--------------------+--------------------------+----------------+--------------+------------+------------+
| 2  | 2        | 1                  | 2                        | 2018-02-01     | 2018-02-03   | 2018-01-23 | 2018-02-03 |
+----+----------+--------------------+--------------------------+----------------+--------------+------------+------------+

Проблема, с которой я столкнулся, заключается в том, что я не могу заставить total_lookback_frequency работать должным образом, он всегда возвращает тот же результат, что и campaign_frequency (который является просто группой count (id) по id, кампании).

Ниже приведено то, что у меня было (это не работает):

SELECT  
  id,
  campaign,
  min(date) as first_date,
  max(date) as end_date,
  count(id) as total_lookback_frequency,
WHERE
  date >= sub(date, INTERVAL 730 hour)
GROUP BY
  id,
  campaign,
  date

Не могли бы вы помочь здесь?

Спасибо!

1 Ответ

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

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  id,
  campaign,
  COUNT(1) campaign_frequency,
  (
    SELECT COUNT(1) 
    FROM `project.dataset.table` 
    WHERE id = t.id
    AND dt BETWEEN  DATE_SUB(t.campaign_start, INTERVAL 3 MONTH) AND DATE_SUB(t.campaign_start, INTERVAL 1 DAY)
  ) total_lookback_frequency,
  campaign_start,
  campaign_end,
  MIN(dt) AS first_date,
  MAX(dt) AS end_date
FROM `project.dataset.table` t
GROUP BY id, campaign, campaign_start, campaign_end

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, DATE '2018-01-01' dt, 1 campaign, DATE '2018-01-01' campaign_start, DATE '2018-02-03' campaign_end UNION ALL
  SELECT 1, '2018-02-01', 2, '2018-02-01', '2018-02-03' UNION ALL
  SELECT 1, '2018-02-02', 2, '2018-02-01', '2018-02-03' UNION ALL
  SELECT 1, '2018-02-03', 2, '2018-02-01', '2018-02-03' UNION ALL
  SELECT 2, '2018-01-23', 1, '2018-01-01', '2018-02-03' UNION ALL
  SELECT 2, '2018-02-03', 2, '2018-02-01', '2018-02-03' 
)
SELECT 
  id,
  campaign,
  COUNT(1) campaign_frequency,
  (
    SELECT COUNT(1) 
    FROM `project.dataset.table` 
    WHERE id = t.id
    AND dt BETWEEN  DATE_SUB(t.campaign_start, INTERVAL 3 MONTH) AND DATE_SUB(t.campaign_start, INTERVAL 1 DAY)
  ) total_lookback_frequency,
  campaign_start,
  campaign_end,
  MIN(dt) AS first_date,
  MAX(dt) AS end_date
FROM `project.dataset.table` t
GROUP BY id, campaign, campaign_start, campaign_end
-- ORDER BY id, campaign
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...