Redshift SQL - 跳过的序列

Posted

技术标签:

【中文标题】Redshift SQL - 跳过的序列【英文标题】:Redshift SQL - Skipped sequence 【发布时间】:2018-11-14 22:46:08 【问题描述】:

我正在处理申请人管道数据,需要计算进入管道/漏斗每个阶段的申请人的数量。如果申请人跳过一个阶段,我无论如何都需要将他们计入该阶段。以下是该数据如何查找一位申请人的示例:

Stage name | Entered on
Application Review | 9/7/2018
Recruiter Screen | 9/10/2018
Phone Interview | blank
Interview | 9/17/2018
Interview 2 | 9/20/2018
Offer | blank

这就是表格的样子:

CREATE TABLE application_stages (
application_id bigint,
stage_id bigint,
entered_on timestamp without time zone,
exited_on timestamp without time zone,
stage_name character varying
);

在此示例中,我想计算通过面试 2(包括跳过/空白电话面试阶段)的申请审核,而不是报价。我将如何用 SQL 编写上述内容? (数据存储在 Amazon Redshift 中。使用 SQL 工作台进行查询。)

另外,如果我可以在我的问题中添加任何其他内容以使问题/解决方案更清晰,请告诉我。

【问题讨论】:

欢迎来到***。您应该提供文本数据而不是屏幕截图。如果您添加表格方案也会很好。 感谢指导!我会更新的。 【参考方案1】:

您可以像这样在event_list 表中硬编码管道的各个阶段:

id | stage_name
1 | first stage 
2 | second stage 
3 | third stage 
4 | fourth stage 

UPD:漏斗的阶段越深,其 ID 越高。这样,您可以比较它们,即third stagesecond stage 更深,因为3>2。因此,如果您需要找到达到第二阶段的人,它包括具有 id=2 的事件或具有 id>2 的事件的人,即漏斗中更深的事件。

如果错过了second stage 并且为某个人记录了third stage,您仍然可以通过stage_name 将您的事件数据加入此表并计算记录数,将该人计为“到达第二阶段”用id>=2,喜欢

select count(distinct user_id)
from event_data t1
join event_list t2
using (stage_name)
where t2.id>=2

或者,您可以将您的事件表连接到event_list 并使用返回前一行的值的lag 函数填补空白(即在这种情况下将first stage时间戳分配给second stage以上)

【讨论】:

假设你用它来计算电话面试,这不会计算两次,对于上面的例子,interview1 和 2 各一次?这是一个好的开始,但是您需要计算不同的 application_ids。 @AlexYes 有时空白是正确的,不应计算在内。就像在这个例子中一样,Offer 是空白的,不应该被计算在内,因为它是最后阶段。你的建议还有效吗?此外,空白可以处于任何阶段,并不总是 id 2。可能会有多个空白。 @WilsonS 我在帖子中添加了更详细的解释,希望它有意义。如果您想计算报价,您仍然可以正确执行,因为这是最深的事件,并且只会计算真正的非空白。 @DancingFool 当然!我已经编辑了查询。这很明显,我更专注于填补空白的方法。 感谢更新的 SQL。如果跳过第一阶段,id>=2 会起作用吗?另外,我没有对 redshift 数据库的更新访问权限。我仍然可以按照您的建议创建一个 event_list 表吗?那将如何运作?也许是一个案例语句来为每个阶段分配一个 id?我将尝试滞后建议。我之前通过 pastebin 提供了表格的副本。随意看看那里。我真的很感谢所有的帮助!【参考方案2】:

这是我最终得到的 SQL。感谢您的想法,@AlexYes!

select stage_name,  
application_stages.application_id, entered_on, 
case when entered_on is NULL then lead(entered_on,1) 
ignore nulls
over 
(PARTITION BY application_stages.application_id order by case stage_name 
when 'Application Review' then 1 
when 'Recruiter Screen' then 2 
when 'Phone Interview' then 3
when 'Interview' then 4
when 'Interview 2' then 5
when 'Offer' then 6
when 'Hired' then 7 end) else entered_on end as for_count, exited_on
from application_stages

我意识到上面的 SQL 并没有给我计数,但我正在 Tableau 中进行计数。很高兴拥有上述格式,以防我需要对新的“for_count”字段进行其他计算。

【讨论】:

以上是关于Redshift SQL - 跳过的序列的主要内容,如果未能解决你的问题,请参考以下文章

System.Json - 属性序列化跳过的自定义规则

Python 将数据从 Redshift 加载到 S3

使用 COPY 功能自动将数据加载到 Redshift

如何从本地安装的 spark 连接到 aws-redshift?

在 Redshift 中拆分行

在 Redshift 中使用等效的 Latin1 进行转换