4
我希望在注册日期之后立即访问信息(visit_dt,visit_loc等)。
例如:
CREATE TABLE tst_tbl
(
id NUMBER,
last_name VARCHAR2 (50),
first_name VARCHAR2 (50),
dob DATE,
register_dt DATE,
register_loc VARCHAR2 (50),
visit_dt DATE,
visit_loc VARCHAR2 (50),
visit_comments VARCHAR2 (30)
);
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('09/05/2017' ,'MM/DD/YYYY') ,'NEW YORK', to_date('02/26/2018','MM/DD/YYYY'), 'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('09/05/2017' ,'MM/DD/YYYY') ,'NEW YORK', to_date('2/12/2018', 'MM/DD/YYYY'),'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('09/05/2017' ,'MM/DD/YYYY') ,'NEW YORK', to_date('11/6/2017', 'MM/DD/YYYY'),'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('09/05/2017' ,'MM/DD/YYYY') ,'NEW YORK', to_date('10/23/2017','MM/DD/YYYY'), 'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('09/05/2017' ,'MM/DD/YYYY') ,'NEW YORK', to_date('3/27/2018', 'MM/DD/YYYY'),'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('09/05/2017' ,'MM/DD/YYYY') ,'NEW YORK', to_date('3/19/2018', 'MM/DD/YYYY'),'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('09/05/2017' ,'MM/DD/YYYY') ,'NEW YORK', to_date('9/11/2017', 'MM/DD/YYYY'),'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('2/7/2018' ,'MM/DD/YYYY') , 'NEW YORK',to_date('11/6/2017 ','MM/DD/YYYY'), 'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('2/7/2018' ,'MM/DD/YYYY') , 'NEW YORK',to_date('3/19/2018', 'MM/DD/YYYY'),'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('2/7/2018' ,'MM/DD/YYYY') , 'NEW YORK',to_date('9/11/2017', 'MM/DD/YYYY'),'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('2/7/2018' ,'MM/DD/YYYY') , 'NEW YORK',to_date('3/27/2018', 'MM/DD/YYYY'),'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('2/7/2018' ,'MM/DD/YYYY') , 'NEW YORK',to_date('2/26/2018', 'MM/DD/YYYY'),'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('2/7/2018' ,'MM/DD/YYYY') , 'NEW YORK',to_date('10/23/2017','MM/DD/YYYY'), 'NEW JERSEY', '');
INSERT INTO tst_tbl VALUES(1234, 'John', 'Smith', to_date('12/01/1980','MM/DD/YYYY') , to_date('2/7/2018' ,'MM/DD/YYYY') , 'NEW YORK',to_date('2/12/2018', 'MM/DD/YYYY'),'NEW JERSEY', '');
COMMIT;
我尝试使用以下逻辑对注册日期和访问日期进行排序,然后使用Lead检索以下日期并仅过滤注册日期。但是,我无法添加上述其他字段。
1234, John, Smith, 12/01/1980, 09/05/2017, NEW YORK, 9/11/2017, NEW JERSEY
1234, John, Smith, 12/01/1980, 2/7/2018, NEW YORK, 2/12/2018, NEW JERSEY
答案 0 :(得分:0)
我觉得您太复杂了。如果访问日期在登记日期之后少于30天,您可以通过这种方式添加指标。如果出于某些原因对您不起作用,请编辑您的问题并添加更多数据(例如,输出应为什么样?)
select r.*,
case when (floor(visit_dt - register_dt) between 0 and 29)
then 'Y' else 'N'
end as less_than_30_days
from tst_tbl r;
但这是基于您的示例输出。根据您的查询,您似乎要查找过去30天内(该ID)具有 any 注册日期的所有访问。如果您更愿意这样做,这是一种更简单的方法。
select v.*,
(select nvl(max('Y'),'N')
from tst_tbl r
where r.id = v.id
and (floor(v.visit_dt - r.register_dt) between 0 and 29))
as reg_within_30_days
from tst_tbl v;
答案 1 :(得分:0)
如果我理解正确,并且假定ID是唯一标识符,则希望按(ID,REGISTER_DT)并按每个组对行进行分组,以仅使用VISIT_DT> = REGISTER_DT,然后按每个组对行进行分组通过VISIT_DT选择最早(最旧)的行。如果是这样,类似这样的事情应该起作用:
select (columns you want)
from (
select t.*
, row_number() over (partition by id, register_dt
order by visit_dt) as rn
from tst_tbl t
where visit_dt >= register_dt
)
where rn = 1
;
答案 2 :(得分:0)
尝试一下
Select id, last_name, first_name, dob, register_dt, register_loc,
visit_dt
From (
Select r.id, r.last_name, r.first_name, r.dob, r.register_dt, r.register_loc,
r.visit_dt, r.visit_loc, row_number() over (partition by r.register_dt order by r.visit_dt) r
From tst_tbl r
where register_dt < visit_dt
) x
Where x.r = 1