Дубликаты, генерируемые левым соединением - PullRequest
1 голос
/ 04 марта 2020

В настоящее время я пытаюсь изменить таблицу для агрегирования метрик электронной почты по уровням подписчиков. Вот как выглядит таблица, с которой я работаю:

 SELECT accountid,
       jobid,
       listid,
       batchid,
       subscriberkey,
       eventdate,
       eventtype,
       isunique,
       triggerersenddefinitionobjectid,
       triggeredsendcustomerkey,
       url,
       linkname,
       linkcontent,
       emailid,
       schedtime,
       pickuptime,
       deliveredtime,
       eventid,
       jobtype,
       jobstatus,
       emailname,
       emailsubject,
       sendtype,
       dynamicemailsubject,
       emailsenddefinition
FROM   email_metrics;  

Я хочу изменить ее так, чтобы для каждой уникальной комбинации (subscriberkey + emailid) у меня были данные о том, действительно ли они открыл тот же адрес электронной почты, и если они нажали на это письмо.

Пример того, как будут выглядеть текущие данные (я упростил структуру таблицы до 3-х столбцов для простоты объяснения моей проблемы, извините, не уверен, как вставить сюда таблицу, так что это может выглядеть запутанно):

Пример записи 1:

Subscriberkey | EmailID | Eventtype Open
1234          | 2       | Click
1234          | 2       |          

И я стремлюсь существенно изменить его до одной записи для каждой уникальной комбинации (SubscriberKey, EmailName):

SubscriberKey | EmailID2 | Is_Open | Is_Click 
1234          | 2        | True    | True

Это сведет воедино все данные, относящиеся к определенной c подписке + комбо отправки по электронной почте, и отобразит соответствующие метрики на одной записи.

Я мог успешно сделать это раньше, но мой ноутбук недавно умер, и, к сожалению, мой ноутбук Сценарий не может быть извлечен :(

До сих пор я придумал следующее, но обнаружил, что в моих данных, сгенерированных из Left Joins, есть дубликаты, у меня возникли проблемы с пониманием того, как могу убедиться, что это не произойдет с моими данными:

WITH email_sent AS (
    SELECT *
    FROM email_metrics em 
    WHERE eventtype ='Sent'
),
    email_open AS (
    SELECT *
    FROM email_metrics em2 
    WHERE eventtype ='Open'
    AND isunique = True),

    email_click AS (
    SELECT * 
    FROM email_metrics em3 
    WHERE eventtype='Click'
    AND isunique = True
)

SELECT DISTINCT a.jobid, 
    a.subscriberkey,
    a.send_time,
    a.emailid,
    a.emailname,
    a.emailsubject,
    a.dynamicemailsubject,
    a.emailsenddefinition,
    a.is_opened,
    a.open_date,
    COALESCE (c.eventtype,'Not Clicked') AS is_click,
    c.eventdate AS click_date,
    c.url,
    c.linkname,
    c.linkcontent
FROM
(SELECT DISTINCT s.jobid,
    s.subscriberkey,
    (s.eventdate) AS send_time,
    s.emailid,
    s.emailname,
    s.emailsubject,
    s.dynamicemailsubject,
    s.emailsenddefinition,
    COALESCE (o.eventtype, 'Not Opened') AS is_opened,
    (o.eventdate) AS open_date
FROM email_sent s 
LEFT JOIN email_open o ON (s.jobid=o.jobid AND s.subscriberkey=o.subscriberkey)) a
LEFT JOIN email_click c ON (a.jobid=c.jobid AND a.subscriberkey=c.subscriberkey);

1 Ответ

1 голос
/ 04 марта 2020

Я бы порекомендовал использовать для этого условное агрегирование:

select
    subscriberkey,
    emailid,
    bool_or(eventtype = 'Open') Is_Open,
    bool_or(eventtype = 'Click') Is_Click
from email_metrics
group by subscriberkey, emailid
...