今年需要吸引具有特定活动的客户(潜在客户),而该活动(潜在客户)是他们的最后一个活动

Posted

技术标签:

【中文标题】今年需要吸引具有特定活动的客户(潜在客户),而该活动(潜在客户)是他们的最后一个活动【英文标题】:Need to pull customers with specific activity this year (Leads), where that activity (Lead) was their last one 【发布时间】:2021-08-27 22:41:34 【问题描述】:

我正在使用 SSMS 创建一份报告,显示销售代表没有跟进我们今年收到的潜在客户的客户帐户。这将在活动列表中的帐户(帐户中的操作)中显示,“Lead”是列出的最后一项(代表在收到潜在客户后没有采取任何操作)。

我的代码正在为今年至少获得一次潜在客户的所有客户提取最新的“潜在客户”活动:

CustomerName Activity Date
Bob's Tires Lead 2021-01-05
Ned's Nails Lead 2021-02-02
Good Eats Lead 2021-02-03

我只需要它来吸引潜在客户是最后一次活动的客户:

CustomerName Activity Date
Ned's Nails Lead 2021-02-02

这是我的代码和示例表。我错过了什么?我尝试了很多事情都没有运气。

WITH activities AS (
    SELECT 
        a. *
        , CASE WHEN a.ContactDate = MAX(CASE WHEN a.Activity LIKE 'Lead%'
               THEN a.ContactDate END) OVER (PARTITION BY a.AcctID)
          THEN 1 ELSE 0 END AS no_followup
    FROM AcctActivities a
    WHERE a.ContactDate >= '2021-01-01'
)
SELECT 
    c.Name,
    act.Activity,
    act.ContactDate
FROM Customers c
INNER JOIN activities act ON c.AcctID = act.AcctID AND act.no_followup = 1
ORDER BY c.AcctID, act.ContactDate ASC

表 1:客户 (c)

AcctID CustomerName
11 Bob's Tires
12 Ned's Nails
13 Good Eats
14 Embers

表 2:活动 (a)

AcctivityID AcctID Activity Date
1 11 Contact Added 2021-01-01
2 11 Lead 2021-01-05
3 11 Phone Call 2021-01-06
4 12 Lead 2021-02-02
5 13 Lead 2021-02-03
6 13 Phone Call 2021-01-15
7 13 Sales Email 2021-01-15
8 14 Cold Call 2021-01-20

【问题讨论】:

样本数据和期望的结果真的很有帮助。另外,我不清楚你的问题是什么。您的标题和问题描述似乎不是 100% 相同。 已更新。谢谢你的指导! 【参考方案1】:

您的方法过滤了哪些行可能被认为是比较中的最大值。我在下面包含了建议的修改,它还修改了您的 CASE 表达式以考虑当前行是潜在客户,因为案例表达式可能会过滤要考虑的有界值(即,它将为您提供最新的潜在客户活动,但最新的潜在客户活动可能不是您的最新活动)。

另一个可能是可选但安全的修改是在分区的OVER 子句中添加ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING。虽然您也可以使用UNBOUNDED PRECEDING 而不是CURRENT ROW,但当订购ContactDate 之前的所有行已经小于当前值并且您对联系日期的最大值感兴趣时,这似乎是额外的处理.默认情况下,窗口函数会考虑当前和之前的所有行。修改会要求窗口函数查看当前行之后的分区中的所有结果。

例如。

WITH activities AS 
(
SELECT 
        a. *,
        CASE 
            WHEN a.Activity LIKE 'Lead%' AND
                 a.ContactDate = (MAX(a.ContactDate) OVER (PARTITION BY a.AcctID ORDER BY a.ContactDate ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING  ))
                THEN 1 
                ELSE 0
        END AS no_followup
    FROM 
        AcctActivities a
    WHERE 
        a.ContactDate >= '2021-01-01'

)
SELECT 
    c.Name,
    act.Activity,
    act.ContactDate
FROM 
    Customers c
INNER JOIN 
    activities act ON c.AcctID = act.AcctID
                   AND act.no_followup = 1
ORDER BY 
    c.AcctID, act.ContactDate ASC

此外,如果您只对客户详细信息感兴趣并且所有生成的活动名称都是Lead,您可以考虑使用以下方法,它使用聚合和有子句来过滤您想要的结果。这种方法通过提早过滤,在结果 CTE 中返回的细节更少。

WITH customers_with_last_activity_as_lead as (
    SELECT AcctID, MAX(ContactDate) as ContactDate
    FROM AcctActivities a
    WHERE a.ContactDate >= '2021-01-01'
    GROUP BY AcctID
    HAVING
        MAX(a.ContactDate) = MAX(
            CASE 
                 WHEN a.Activity LIKE 'Lead%' THEN a.ContactDate
            END
        )
)
SELECT 
    c.Name,
--  'Lead' as Activity, -- Uncomment this line if it is that you would like to see this constant value in your resulting queries.    
    act.ContactDate
FROM 
    Customers c
INNER JOIN 
   customers_with_last_activity_as_lead  act ON c.AcctID = act.AcctID
ORDER BY 
    c.AcctID, act.ContactDate ASC

如果所有值都不是常量/文字Lead,那么以下方法也可能有助于检索正确的活动名称

WITH customers_with_last_activity_as_lead as (
    SELECT 
        AcctID, 
        REPLACE(MAX(CONCAT(ContactDate,Activity)),MAX(ContactDate),'') as Activity,
        MAX(ContactDate) as ContactDate
    FROM AcctActivities a
    WHERE a.ContactDate >= '2021-01-01'
    GROUP BY AcctID
    HAVING
        MAX(a.ContactDate) = MAX(
            CASE 
                 WHEN a.Activity LIKE 'Lead%' THEN a.ContactDate
            END
        )
)
SELECT 
    c.Name,
    act.Activity, 
    act.ContactDate
FROM 
    Customers c
INNER JOIN 
   customers_with_last_activity_as_lead  act ON c.AcctID = act.AcctID
ORDER BY 
    c.AcctID, act.ContactDate ASC

让我知道这是否适合你.

【讨论】:

谢谢你,@ggordon!您的第一个 cte 选择 a* 的查询完美运行!就本报告而言,我们更关注活动而不是客户数据,因此表现良好并允许我从活动表中添加更多列,而不会返回不同数量的记录。我还没有完全弄清楚其他两个拉动的确切差异,因为他们拉动的行数不同,但无论如何我都会和他们一起玩 - 我也许可以将它们应用于一些不同的报告我正在尝试。再次感谢您为此付出的所有努力!【参考方案2】:

我同意 Gordon 的观点,即您的问题并不完全清楚(您实际上只关心今年的活动吗?no_followup 的预期含义是什么?)。话虽如此,我认为这就是你想要的:

select      c.Name, 
            lastActivity.Activity, 
            lastActivity.ContactDate
from        Customers c
cross apply (
               select   top 1 a.Activity, a.ContactDate
               from     activities a 
               where    a.acctId = c.acctId 
                        -- and a.ContactDate >= '2021-01-01' uncomment this if you only care about activity this year
               order by a.ContactDate desc
            ) lastActivity
where       lastActivity.Activity like 'Lead%'

【讨论】:

以上是关于今年需要吸引具有特定活动的客户(潜在客户),而该活动(潜在客户)是他们的最后一个活动的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WordPress 中创建登录页面

COUNT 数字在时间段之前不存在时不同

Web设计的十大错误

Bigquery 表潜在客户列值基于日期

从客户端检测到潜在危险的Request.Form值

LeetCode(数据库)- 寻找今年具有正收入的客户