Вложенный оценочный вопрос SQL с не вложенным

это может быть основной вопрос, но я просто не мог понять. Пример данных и запрос можно найти здесь. (на вкладке "Первое касание")

Я пропущу здесь маркетинговую терминологию, но в основном то, что делает запрос, — это присвоение кредитов/баллов местам размещения (рекламе) на основе определенного правила. Здесь действует правило «первого касания», что означает, что заслуга принадлежит первому пользователю, с которым взаимодействует реклама — это может быть просмотр или клик. «ПРОЖЕКТОР» здесь означает, что пользователь совершает действие, чтобы фактически купить продукт (конверсия).

Как видно из примера данных, у пользователя 1 есть одна конверсия, а первое объявление — это место размещения 22 (первое касание), поэтому 22 получает 1 балл. У пользователя 2 есть две конверсии, и первое объявление каждого из них — 11, поэтому 11 получает 2 балла.

Логика здесь довольно проста, но мне было трудно понять сам запрос. Какой смысл сравнивать prev_conversion_event.event_time < conversion_event.event_time? Разве они не одинаковы по сути? Я имею в виду, что они оба пришли из UNNEST(t.*_path.events). И attributed_event.event_time тоже оттуда.

Что в любом случае оценивают prev_conversion_event.event_time, conversion_event.event_time и attributed_event.event_time в этом сценарии? Я просто запутался, как черт здесь. Очень ценю помощь!

Для удобства я вставляю примеры данных, запрос и вывод ниже: Примеры данных Вывод

/* Substitute *_paths for the specific paths table that you want to query. */
SELECT
  (
  SELECT
    attributed_event_metadata.placement_id
  FROM (
    SELECT
      AS STRUCT attributed_event.placement_id,
      ROW_NUMBER() OVER(ORDER BY attributed_event.event_time ASC) AS rank
    FROM
      UNNEST(t.*_paths.events) AS attributed_event
    WHERE
      attributed_event.event_type != "FLOODLIGHT"
      AND attributed_event.event_time < conversion_event.event_time
      AND attributed_event.event_time > (
      SELECT
        IFNULL( (
          SELECT
            MAX(prev_conversion_event.event_time) AS event_time
          FROM
            UNNEST(t.*_paths.events) AS prev_conversion_event
          WHERE
            prev_conversion_event.event_type = "FLOODLIGHT"
            AND prev_conversion_event.event_time < conversion_event.event_time),
          0)) ) AS attributed_event_metadata
  WHERE
    attributed_event_metadata.rank = 1) AS placement_id,
  COUNT(*) AS credit
FROM
  adh.*_paths AS t,
  UNNEST(*_paths.events) AS conversion_event
WHERE
  conversion_event.event_type = "FLOODLIGHT"
GROUP BY
  placement_id
HAVING
  placement_id IS NOT NULL
ORDER BY
  credit DESC

person user9366660    schedule 03.05.2020    source источник


Ответы (1)


Честно говоря, это довольно запутанный вопрос, я думаю, что знаю, о чем вы спрашиваете, пожалуйста, поправьте меня, если это не так.

Какой смысл сравнивать предыдущую_конверсию_события.событие_время ‹ конверсию_событие.событие_время?

Вы делаете что-то вроде «Я хочу, чтобы все события из этого (не вложенные), и для каждого события я хочу знать, какие события предшествуют друг другу».

Скажем, у вас есть [A, B, C, D], и они упорядочены последовательно (A произошло до B, A и B произошли до C и т. д.), результат этого разделения и объединения по этому условию даст вам что-то например [A:(NULL), B:(A), C:(A, B), D:(A, B, C)] (извините за обозначение, надеюсь, это не сбивает с толку), являясь каждой парой ключ: значение, Событие: (Предшественники). Обратите внимание, что перед A нет событий, а перед B есть A и т. д. Теперь у вас есть хорошая таблица со всеми событиями конверсии, объединенными с событиями, которые произошли до этого.

person Francesco Galletta    schedule 04.05.2020
comment
Привет @Франческо! Большое спасибо за ответ! Это помогает, но я все еще не совсем уверен, как был получен упомянутый вами результат. В примерных данных, насколько я понимаю, prev_conversion_event.event_time — это список из 7 целых чисел (event_time), так же как и conversion_event.event_time. Как сравнение двух одинаковых списков целых чисел создает упомянутую вами таблицу? Я определенно где-то ошибаюсь, но не знаю, как исправить себя. - person user9366660; 04.05.2020
comment
Ну, это не сразу. UNNESTING будет разветвлять все члены вложенного элемента, но затем условие WHERE сделает так, что в вашем окончательном запросе будут показаны только те, которые соответствуют логике (тот, который я разделил). Попробуйте поднять это с помощью листа бумаги, от самого внутреннего запроса до внешнего, оценив, как должен выглядеть каждый из подзапросов, и это станет намного яснее. (Или запускайте подзапросы по отдельности в BigQuery, как вам удобно) - person Francesco Galletta; 05.05.2020