Результаты SQL GROUP BY — Salesforce Marketing Cloud

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

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

SELECT 
    EmailAddress,
    MIN(CreatedDate)
FROM [_ListSubscribers]
WHERE EmailAddress IN
    (
        SELECT EmailAddress
        FROM _ListSubscribers
        GROUP BY EmailAddress
        HAVING COUNT(EmailAddress) > 1
    )
GROUP BY EmailAddress

Когда я добавляю SubscriberKey в запрос, результаты УДВОИВАЮТСЯ! Почему? Я просто хочу увидеть, что SubscriberKey привязан к найденному мной EmailAddress, который имеет самую старую дату в подзапросе.

SELECT 
    EmailAddress,
    SubscriberKey,
    MIN(CreatedDate)
FROM [_ListSubscribers]
WHERE EmailAddress IN
    (
        SELECT EmailAddress
        FROM _ListSubscribers
        GROUP BY EmailAddress
        HAVING COUNT(EmailAddress) > 1
    )
GROUP BY EmailAddress, SubscriberKey

person Martin    schedule 12.04.2021    source источник


Ответы (2)


Вы получаете несколько записей, потому что вы группируете их по SubscriberKey. Вам нужно будет сопоставить EmailAddress и CreatedDate. Попробуйте выполнить подзапрос и присоединить его к исходной таблице.

select 
[_ListSubscribers].EmailAddress,
[_ListSubscribers].SubscriberKey,
[_ListSubscribers].CreatedDate,
from
(
SELECT 
    EmailAddress,
    MIN(CreatedDate) as CreatedDate
    FROM [_ListSubscribers]
    GROUP BY EmailAddress, SubscriberKey
    Having count(EmailAddress)>1
) SubTbl
inner join
[_ListSubscribers] on
[_ListSubscribers].EmailAddress = SubTbl.EmailAddress
and
[_ListSubscribers].CreatedDate = SubTbl.CreatedDate
person KyleUp    schedule 12.04.2021

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

Используйте 1_:

select l.*
from (select l.*,
             row_number() over (partition by EmailAddress order by CreatedDate desc) as seqnum
      from _ListSubscribers l
     ) l
where seqnum > 1;

Однако, если вы хотите удалить все, кроме самой новой записи, вы можете использовать:

delete from _ListSubscribers
    where CreatedDate < (select max(CreatedDate)
                         from _ListSubscribers l2
                         where l2.EmailAddress = _ListSubscribers.EmailAddress
                        );

Если вам нужны самые старые записи, вы должны изменить логику, используя min() вместо max().

person Gordon Linoff    schedule 12.04.2021