Deduplicar registros com ROW_NUMBER() numa Query Activity

Fique com só o registro mais recente de cada e-mail numa Data Extension usando ROW_NUMBER() e PARTITION BY numa Query Activity do Marketing Cloud.

Verde Snippet Marketing Cloud Engagement 2 min Publicado em

Importações de leads costumam trazer o mesmo e-mail várias vezes. Se a Data Extension de destino tem o e-mail como chave primária, a Query Activity falha com violação de chave primária. Se não tem, você manda o mesmo e-mail duas vezes para a mesma pessoa. A solução é ficar com um registro por e-mail, normalmente o mais recente.

O snippet

SQL
SELECT
    t.Email,
    t.Nome,
    t.Origem,
    t.DataCadastro
FROM (
    SELECT
        l.Email,
        l.Nome,
        l.Origem,
        l.DataCadastro,
        ROW_NUMBER() OVER (
            PARTITION BY LOWER(LTRIM(RTRIM(l.Email)))
            ORDER BY l.DataCadastro DESC
        ) AS ordem
    FROM Leads_Importados l
    WHERE l.Email IS NOT NULL
      AND l.Email <> ''
) t
WHERE t.ordem = 1

Como funciona

  • ROW_NUMBER() numera as linhas dentro de cada grupo, começando em 1.
  • PARTITION BY define o grupo: aqui, cada e-mail. LOWER(LTRIM(RTRIM(...))) faz "Ana@X.com " e "ana@x.com" caírem no mesmo grupo.
  • ORDER BY DataCadastro DESC coloca o registro mais recente como número 1.
  • O WHERE t.ordem = 1 de fora fica só com esse registro.

A numeração precisa estar numa subconsulta: o WHERE da mesma consulta não enxerga a coluna ordem.

Escolhendo o "melhor" registro

O ORDER BY decide quem vence o empate. Alguns critérios comuns:

Quero ficar com… ORDER BY
o mais recente DataCadastro DESC
o mais antigo (primeira origem) DataCadastro ASC
o que tem telefone preenchido CASE WHEN Telefone IS NULL OR Telefone = '' THEN 1 ELSE 0 END, DataCadastro DESC

Na Query Activity

  1. Data Extension de destino com Email como chave primária.
  2. Ação Overwrite para um público limpo a cada execução, ou Update para ir acumulando (a versão mais nova de cada e-mail substitui a anterior).
  3. Se a Data Extension de origem for grande, filtre pela data dentro da subconsulta para não estourar os 30 minutos de limite da Query Activity.

Leia também

Leia também
Título Tipo Plataforma Faixa Leitura
Lookup dentro de loop no AMPscript: rápido no teste, lento no envio real Erro Marketing Cloud Engagement Verde 3 min
Query Activity que estoura os 30 minutos e para a automação Erro Marketing Cloud Engagement Verde 3 min
Data Views no SQL: quem abriu ou clicou nos últimos 30 dias Tutorial Marketing Cloud Engagement Verde 3 min
Subscriber Key igual ao e-mail: o cliente que troca de e-mail vira outra pessoa Erro Marketing Cloud Engagement Amarela 4 min