今年需要吸引具有特定活动的客户(潜在客户),而该活动(潜在客户)是他们的最后一个活动
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%'
【讨论】:
以上是关于今年需要吸引具有特定活动的客户(潜在客户),而该活动(潜在客户)是他们的最后一个活动的主要内容,如果未能解决你的问题,请参考以下文章