首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ETL- (Matillion或Python)过滤的逻辑

使用ETL- (Matillion或Python)过滤的逻辑
EN

Stack Overflow用户
提问于 2020-06-14 01:14:32
回答 1查看 193关注 0票数 0

数据集:

在这里输入图像描述

代码语言:javascript
复制
email   brand   startdate   response_no     need logic for conditions to select/filter response
abc     wi      4/1/2019     1              (select)
abc     wi      9/4/2019     2           (compare with 1st),since less than 6 month, filter out)
abc     wi      11/22/2019   3           (compare with 1st), more than 6 month, select)
xyz     wi      3/2/2019     1           (select)
xyz     wi      10/23/2019   2           (compare with 1st , more than 6 month , select)
xyz     wi      11/27/2019   3           (compare with 2nd, less than 6 month , filter out)
xyz     msw     2/21/2019    1            (select)
xyz     msw     2/20/2020    2           (compare with 1st , more than 6 month , select)

根据上面的数据,我需要为每封电子邮件和品牌写一个逻辑,以筛选出从先前选定的回复开始日期起6个月内的回复否。为了前夫。对于电子邮件abc和品牌wi,我在2019/ 4/1/2019有第一次回复(回复号1),第二次回复是9/24/2019 (从第1次回复起5个月),所以我需要过滤掉它,接下来的第3次回复是11/22/2019 (从第一次回复超过6个月),所以不要过滤掉。如果第二次回复比第一次晚了6个月,我需要避免过滤它,然后将第3次回复与第2次而不是第1次进行比较,筛选的检查条件应该在当前响应日期和之前的响应日期之间,而不对每个品牌的电子邮件进行过滤。

EN

回答 1

Stack Overflow用户

发布于 2020-06-17 17:44:54

我相信你们期待的是下面的输出,是吗?

因此,从SQL的角度来看,我做了以下工作(也可以用其他方式解决):

代码语言:javascript
复制
Create Table DB_NM.SCHEMA_NM.TEST (
  email varchar(255),
  brand varchar(4),  
  startdate date, 
  response_no numeric(10,0)
); 

Insert Into DB_NM.SCHEMA_NM.TEST VALUES('abc', 'wi', '2019-04-01', 1);         
Insert Into DB_NM.SCHEMA_NM.TEST VALUES('abc', 'wi', '2019-09-04', 2);         
Insert Into DB_NM.SCHEMA_NM.TEST VALUES('abc', 'wi', '2019-11-22', 3);         
Insert Into DB_NM.SCHEMA_NM.TEST VALUES('xyz', 'wi', '2019-03-02', 1);         
Insert Into DB_NM.SCHEMA_NM.TEST VALUES('xyz', 'wi', '2019-10-23', 2);         
Insert Into DB_NM.SCHEMA_NM.TEST VALUES('xyz', 'wi', '2019-11-27', 3);         
Insert Into DB_NM.SCHEMA_NM.TEST VALUES('xyz', 'msw', '2019-02-21', 1);          
Insert Into DB_NM.SCHEMA_NM.TEST VALUES('xyz', 'msw', '2020-02-20', 2);

SQL:

代码语言:javascript
复制
Select SRC.EMAIL, 
       SRC.BRAND,
       SRC.STARTDATE
From 
(
Select EMAIL, 
       BRAND,
       STARTDATE,
       lag(STARTDATE) over (partition by EMAIL, BRAND order by STARTDATE) as PREV_DATE,
       Case When PREV_DATE Is Null Then -1 Else (-1*(datediff(month,STARTDATE,PREV_DATE))) End as DATE_DIFF_MTH, 
       Case When PREV_DATE Is Null Then '1949-01-01'
            Else Case When (-1*(datediff(month,STARTDATE,PREV_DATE))) < 6 
                      Then lead(STARTDATE) over (partition by EMAIL, BRAND order by STARTDATE)
                      Else STARTDATE End End as DATE_TO_CONSIDER
From DB_NM.SCHEMA_NM.TEST
Order By 1,2  
) P
Inner Join DB_NM.SCHEMA_NM.TEST SRC ON SRC.STARTDATE = P.DATE_TO_CONSIDER
Where P.PREV_DATE IS NOT NULL
Order BY 1,2

正如我所说,解决这一问题还有其他办法。希望这能有所帮助!

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62367343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档