【问题标题】:SQL GROUP BY Results - Salesforce Marketing CloudSQL GROUP BY 结果 - Salesforce Marketing Cloud
【发布时间】:2021-04-12 18:04:09
【问题描述】:

我正在寻找所有重复记录,然后选择所有重复记录减去每组中最旧的记录,以便我可以删除重复记录并保留一条唯一记录。

当我运行这个查询时,我得到了我想要的结果。留给我一个唯一的电子邮件地址和最早的创建日期。

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

【问题讨论】:

    标签: sql group-by salesforce-marketing-cloud


    【解决方案1】:

    您获得了多条记录,因为您按SubscriberKey 分组。您需要匹配 EmailAddressCreatedDate。尝试执行子查询并将其连接回原始表。

    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
    

    【讨论】:

      【解决方案2】:

      我正在寻找所有重复记录,然后选择所有重复记录减去每组中最旧的记录,以便我可以删除重复记录并保留一条唯一记录。

      使用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() 翻转逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2023-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多