微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2 个条件下的 Oracle SQL 连接列

如何解决2 个条件下的 Oracle SQL 连接列

我尝试在论坛中搜索我的场景,但找不到任何类似的内容。所以这是我冗长的解释:我有 3 个表 - order_fact、session_fact 和 orderline。

create table order_fact (order_no varchar2(20),order_timestamp date,cookie_id number,session_id number);

insert into order_fact values ('69857-20210329',to_date('29-MAR-2021 10:11:58','DD-MON-YYYY HH24:MI:SS'),827678,79853421);
insert into order_fact values ('78345-20210411',to_date('11-APR-2021 18:37:07',569834,84886798);
insert into order_fact values ('79678-20210519',to_date('19-MAY-2021 20:51:34',589623,89556782);
insert into order_fact values ('78759-20210411',to_date('11-APR-2021 09:46:52',685213,77549823);

create table session_fact (cookie_id number,session_id number,session_timestamp date,marketing_vendor varchar2(30),referral_type VARCHAR2(2) );

insert into session_fact values (827678,79853421,to_date('29-MAR-2021 09:47:36','-1','D');
insert into session_fact values (827678,79853378,to_date('28-MAR-2021 12:47:36',79853313,to_date('24-MAR-2021 13:23:36','Naaptol','S');
insert into session_fact values (827678,79853254,to_date('23-MAR-2021 14:39:56','D');
insert into session_fact values (569834,84886798,to_date('11-APR-2021 14:41:44',84886735,to_date('10-APR-2021 11:03:44',84886687,to_date('08-APR-2021 17:26:49',84886659,to_date('03-APR-2021 11:03:44',84886497,to_date('01-APR-2021 07:59:08','Google','R');
insert into session_fact values (685213,77549823,to_date('11-APR-2021 09:07:34','D');
insert into session_fact values (685213,77549786,to_date('09-APR-2021 20:51:34',77549589,to_date('07-APR-2021 14:11:57','FabShopping',77548356,to_date('03-APR-2021 15:38:42','D');
insert into session_fact values (589623,89556782,to_date('19-MAY-2021 16:46:52',89556512,to_date('18-MAY-2021 09:46:52',89556477,to_date('13-MAY-2021 18:34:29',89556348,to_date('10-MAY-2021 16:13:49','D');

create table orderline (order_no varchar2(20),ol_nbr number,ol_ref varchar2(5));

insert into orderline values ('78345-20210411','-2');
insert into orderline values ('78345-20210411',1,'HV3');
insert into orderline values ('78345-20210411',2,'HV3');
insert into orderline values ('78759-20210411','-2');
insert into orderline values ('78759-20210411','PS5');
insert into orderline values ('78759-20210411',3,'PS5');
insert into orderline values ('79678-20210519','-2');
insert into orderline values ('79678-20210519','NPT');
insert into orderline values ('79678-20210519','NPT');
insert into orderline values ('69857-20210329','-2');
insert into orderline values ('69857-20210329','HV3');
insert into orderline values ('69857-20210329','HV3');

从上面可以看出 order_fact 和 session_fact 表是通过 cookie 和 session id 连接的。请求是从上述 3 个表中获取这些列:ORDER_NO、MARKETING_vendOR、REFERRAL_TYPE、OL_REF。

我已经编写了 JOIN 查询

select a.ORDER_NO,b.MARKETING_vendOR,b.REFERRAL_TYPE,c.OL_REF 
FROM order_fact a 
INNER JOIN session_fact b
ON (a.cookie_id = b.COOKIE_ID AND 
b.session_timestamp < a.order_timestamp AND 
b.session_timestamp > a.order_timestamp-7)
INNER JOIN orderline c ON 
(a.ORDER_NO = c.ORDER_NO AND c.OL_NBR = 1);

这是我的棘手情况:

  1. 获取session_fact表中order_fact中cookie_id的数据,时间戳不超过order_timestamp前7天。例如 - order_no 78345-20210411 被放置在 11-APR-2021 18:37:07。使用该订单的 cookie id,我得到 session_fact 中的所有行,直到 11-APR - 7 days = 4-APR。所以不能考虑 4 月 3 日和 1 日的数据。这已在我的查询中得到照顾。但我想提一下为什么我在第一个 JOIN ON 条件中有额外的 AND 子句。

  2. 从上面第 1 点得到的数据中,不考虑那些 REFERRAL_TYPE = 'D' 和 MARKETING_vendOR = '-1' 的记录。可以考虑“S”和“-1”,“R”和“-1”也是如此。基本上任何值都可以被考虑,只要它不是“D”和“-1”。并在order_fact表中选择时间戳最接近order_timestamp的记录。现在这就是棘手的地方 - 如果过去 7 天没有记录 REFERRAL_TYPE 和 MARKETING_vendOR 的组合不是“D”和“-1”,那么在 cookie_id 和 session_id 上加入表 order_fact 和 session_fact 并获取值。

  3. 联接表 order_fact 和 orderline ON ORDER_NO 和 OL_NBR = 1。这在我的联接查询中也已注意。

所以我唯一的问题是在第 2 点中提到的 2 个不同条件下获取 session_fact 和 order_fact 之间的 JOIN。这可以通过 sql 完成吗?我团队的技术主管让我写一个 PL/sql 块。我这样做是因为最初的请求是在 order_fact 表中添加 MARKETING_vendOR、REFERRAL_TYPE、OL_REF 列并从它们各自的表中获取值。我不禁觉得这可以通过 sql 使用 CASE 来完成。还是我错了?如果有人能帮我解决这个问题,我将不胜感激。

编辑:添加结果数据集

enter image description here

编辑:有好心人帮我吗? ? 我认为在 sql 语句中是不可能的。

解决方法

并在order_fact表中选择时间戳最接近order_timestamp的记录

从您的描述来看,您只需要 session_timestamp 的前 1 条记录:

with
 step1 as (
   SELECT 
       a.ORDER_NO,a.order_timestamp,c.MARKETING_VENDOR,c.REFERRAL_TYPE,c.session_timestamp
   FROM order_fact a 
   cross apply (
       select *
       from session_fact b
       where a.cookie_id = b.COOKIE_ID 
         and (REFERRAL_TYPE,MARKETING_VENDOR) not in (('D','-1'))
         AND b.session_timestamp < a.order_timestamp 
         --AND b.session_timestamp > a.order_timestamp-7
       order by b.session_timestamp desc
       fetch first 1 rows only
   ) c
)
select
   s.*,o.OL_REF 
FROM 
   step1 s
   JOIN orderline o 
        ON (s.ORDER_NO = o.ORDER_NO AND o.OL_NBR = 1)
;

结果:

ORDER_NO       ORDER_TIMESTAMP     MARKETING_VENDOR REFERRAL_TYPE SESSION_TIMESTAMP   OL_REF
-------------- ------------------- ---------------- ------------- ------------------- ------
78345-20210411 2021-04-11 18:37:07 Google           R             2021-04-01 07:59:08 HV3
78759-20210411 2021-04-11 09:46:52 FabShopping      D             2021-04-07 14:11:57 PS5
69857-20210329 2021-03-29 10:11:58 Naaptol          S             2021-03-24 13:23:36 HV3

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。