Salesforce账户Tier达成日期计算SQL查询异常排查求助
问题排查与修正方案
问题根源
你的查询逻辑存在核心错误:直接在单条记录层面判断Tier条件,但样本数据中每条记录的课程数值(如Sales 101)都是单个用户的完成数(0或1),单条记录永远无法满足Sales_101 >=3这类累计条件,因此Ascent和Summit字段返回null。
你需要先累计每个Salesforce账户的课程完成总数,再找到账户首次达到各Tier标准的日期。
修正后的SQL查询
WITH CumulativeCourses AS ( -- 按账户分组,按日期排序,累计各课程的完成总数 SELECT salesforce_account_id, acquired_date, SUM(sales_101) OVER (PARTITION BY salesforce_account_id ORDER BY acquired_date) AS total_sales_101, SUM(sales_201) OVER (PARTITION BY salesforce_account_id ORDER BY acquired_date) AS total_sales_201, SUM(tech_101) OVER (PARTITION BY salesforce_account_id ORDER BY acquired_date) AS total_tech_101, SUM(tech_201) OVER (PARTITION BY salesforce_account_id ORDER BY acquired_date) AS total_tech_201 FROM YourTableName ), TierDates AS ( -- 提取各Tier首次达成的日期 SELECT salesforce_account_id, MIN(acquired_date) AS Authorized, -- 任意课程完成的最早日期 -- 首次满足Ascent条件的日期 MIN(CASE WHEN total_sales_101 >=3 AND total_sales_201 >=2 AND total_tech_101 >=1 THEN acquired_date END) AS Ascent, -- 首次满足Summit条件的日期 MIN(CASE WHEN total_sales_101 >=4 AND total_sales_201 >=2 AND total_tech_101 >=4 AND total_tech_201 >=2 THEN acquired_date END) AS Summit FROM CumulativeCourses GROUP BY salesforce_account_id ) SELECT salesforce_account_id, Authorized, Ascent, Summit, -- 确定最高达成级别 CASE WHEN Summit IS NOT NULL THEN 'Summit' WHEN Ascent IS NOT NULL THEN 'Ascent' ELSE 'Authorisation' END AS max_level_achieved FROM TierDates;
逻辑说明
- CumulativeCourses CTE:使用窗口函数
SUM() OVER (PARTITION BY ... ORDER BY ...),按账户分组、日期排序,逐步累加各课程的完成总数,得到截至每个日期时账户的累计完成情况。 - TierDates CTE:对累计数据分组,用
MIN()提取首次满足各Tier条件的日期(因为按日期累加,首次满足的日期就是最早达成的日期)。 - 最终查询:根据各Tier日期是否为空,确定最高达成级别。
测试结果
针对你的样本数据,执行上述查询后将得到期望输出:
| salesforce_account_id | Authorized | Ascent | Summit | max_level_achieved |
|---|---|---|---|---|
| axyz | 2021-01-01 | 2022-12-09 | null | Ascent |
内容的提问来源于stack exchange,提问作者Aryan Tyagi
相关产品推荐
相关产品推荐

