Вложенный SQL оценочный вопрос с unnest - PullRequest
0 голосов
/ 04 мая 2020

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

Я пропущу здесь маркетинговую терминологию, но в основном запрос выполняет аттрибуты кредитов / баллов для мест размещения (объявлений) на основе определенного правила. Здесь правило «первое касание», что означает, что кредит относится к первому рекламному пользователю, с которым взаимодействовал пользователь - это может быть просмотр или клик. «FLOODLIGHT» здесь означает, что пользователь принимает меры для фактической покупки продукта (конверсии).

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

Логика c здесь довольно проста, но мне было трудно понять сам запрос. Какой смысл сравнивать 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

1 Ответ

1 голос
/ 04 мая 2020

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

Какой смысл сравнивать prev_conversion_event.event_time

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

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

...