基于第一行的 Oracle Cross Join
Oracle Cross Join based on first row
我正在使用 Oracle 数据库捕获交易数据。
Table 1:用户打开调查表的交易数据。拥有电子邮件地址的收件人可能会多次打开调查表,但没有填写并提交。同样的调查可以通过Survey_No.
来确定
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/21/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/19/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/10/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/3/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/1/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/1/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/3/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (3, john@email.com,2/1/2020);
Table 2:提交调查的用户交易数据。他们可以一次又一次地重新提交他们的选择。同样,survey_no 将提供有关响应所针对的调查的信息。
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/21/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (3, john@email.com,3/1/2020);
我试图获得的预期输出是形成一个 table,它根据作为加入代理有意义的最近日期加入上述两个 table。 survey_open table 上的哪笔交易被标记为 filled_date 并不那么重要。由于 survey_id 和电子邮件是多对多的,我不想形成交叉连接。
尝试对两个表中的项目进行编号
with o as(
select so.*, row_number() over(partition by survey_no order by open_date) rn
from survey_open so
), f as (
select sf.*, row_number() over(partition by survey_no order by fill_date) rn
from survey_fill sf
)
select o.survey_no
, o.email
, o.open_date
, (select min(f.fill_date)
from f
where f.survey_no = o.survey_no
and f.fill_date >= o.open_date
and f.rn >= o.rn) as fill_date
from o
order by o.survey_no, o.rn desc
我正在使用 Oracle 数据库捕获交易数据。
Table 1:用户打开调查表的交易数据。拥有电子邮件地址的收件人可能会多次打开调查表,但没有填写并提交。同样的调查可以通过Survey_No.
来确定INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/21/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/19/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/10/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/3/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/1/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/1/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/3/2020);
INSERT INTO survey_open (SURVEY_NO,EMAIL,DATE) VALUES (3, john@email.com,2/1/2020);
Table 2:提交调查的用户交易数据。他们可以一次又一次地重新提交他们的选择。同样,survey_no 将提供有关响应所针对的调查的信息。
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/21/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (1, john@email.com,5/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (2, john@email.com,3/15/2020);
INSERT INTO survey_fill (SURVEY_NO,EMAIL,DATE) VALUES (3, john@email.com,3/1/2020);
我试图获得的预期输出是形成一个 table,它根据作为加入代理有意义的最近日期加入上述两个 table。 survey_open table 上的哪笔交易被标记为 filled_date 并不那么重要。由于 survey_id 和电子邮件是多对多的,我不想形成交叉连接。
尝试对两个表中的项目进行编号
with o as(
select so.*, row_number() over(partition by survey_no order by open_date) rn
from survey_open so
), f as (
select sf.*, row_number() over(partition by survey_no order by fill_date) rn
from survey_fill sf
)
select o.survey_no
, o.email
, o.open_date
, (select min(f.fill_date)
from f
where f.survey_no = o.survey_no
and f.fill_date >= o.open_date
and f.rn >= o.rn) as fill_date
from o
order by o.survey_no, o.rn desc