SQL 按结果分组 - Salesforce Marketing Cloud
SQL GROUP BY Results - Salesforce Marketing Cloud
我要查找所有重复记录,然后 select 所有重复项减去每组中最旧的记录,这样我就可以删除重复项并保留一个唯一记录。
当我运行这个查询时,我得到了我想要的结果。给我一个唯一的电子邮件地址和最早的创建日期。
SELECT
EmailAddress,
MIN(CreatedDate)
FROM [_ListSubscribers]
WHERE EmailAddress IN
(
SELECT EmailAddress
FROM _ListSubscribers
GROUP BY EmailAddress
HAVING COUNT(EmailAddress) > 1
)
GROUP BY EmailAddress
当我将 SubscriberKey 添加到查询时,结果翻了一番!这是为什么? 我只想查看与我发现的 EmailAddress 关联的 SubscriberKey,它在子查询中具有最早的日期。
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
您获得了多条记录,因为您按 SubscriberKey
分组。您需要按 EmailAddress
和 CreatedDate
进行匹配。尝试做一个子查询并将其连接回原来的 table.
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
I'm looking to find all duplicate records and then select all duplicates minus the oldest record from each set so that I can delete duplicates and keep one unique record.
使用ROW_NUMBER()
:
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()
翻转逻辑。
我要查找所有重复记录,然后 select 所有重复项减去每组中最旧的记录,这样我就可以删除重复项并保留一个唯一记录。
当我运行这个查询时,我得到了我想要的结果。给我一个唯一的电子邮件地址和最早的创建日期。
SELECT
EmailAddress,
MIN(CreatedDate)
FROM [_ListSubscribers]
WHERE EmailAddress IN
(
SELECT EmailAddress
FROM _ListSubscribers
GROUP BY EmailAddress
HAVING COUNT(EmailAddress) > 1
)
GROUP BY EmailAddress
当我将 SubscriberKey 添加到查询时,结果翻了一番!这是为什么? 我只想查看与我发现的 EmailAddress 关联的 SubscriberKey,它在子查询中具有最早的日期。
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
您获得了多条记录,因为您按 SubscriberKey
分组。您需要按 EmailAddress
和 CreatedDate
进行匹配。尝试做一个子查询并将其连接回原来的 table.
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
I'm looking to find all duplicate records and then select all duplicates minus the oldest record from each set so that I can delete duplicates and keep one unique record.
使用ROW_NUMBER()
:
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()
翻转逻辑。