我ENCOUNTERS
在Oracle 11g数据库中有一张表格,样本医疗保健数据,
ID DC_DATE CPI
1 "1/1/2012" a
2 "1/2/2012" b
3 "1/3/2012" c
4 "1/4/2012" d
5 "2/2/2012" a
6 "2/1/2012" b
7 "2/3/2012" e
8 "2/4/2012" f
9 "2/5/2012" g
10 "2/29/2012" a
ID是一个人的唯一访问标识符,而CPI是一个人ID,用于跟踪人们以后何时再次访问我们。
我的任务是创建一个查询,该查询返回所有这些列以及三个新列,PREVIOUS_ID, PREVIOUS_DC_DATE, and READMIT_DAYS
Readmit_Days是新访问DC_Date与先前访问DC_Date之间的天数差。
目前,我必须运行以下代码来获取所需的数据。
SELECT a.ID,
a.DC_DATE,
a.CPI,
(SELECT MAX(b.ID)
FROM ENCOUNTERS b
WHERE a.CPI = b.CPI
AND a.ID > b.ID) AS Previous_ID,
(SELECT MAX(b.DC_DATE)
FROM ENCOUNTERS b
WHERE a.CPI = b.CPI
AND a.DC_DATE > b.DC_DATE) AS Previous_DC_Date,
( a.DC_DATE - ((SELECT MAX(b.DC_DATE)
FROM ENCOUNTERS b
WHERE a.CPI = b.CPI
AND a.DC_DATE > b.DC_DATE)) ) AS ReAdmit_Days
FROM ENCOUNTERS a;
现在可以用了,但是对我来说看起来太复杂了。有没有更好的方法来获得我所需要的?
这是我在运行时得到的信息,这是正确的。只是在寻找建议。
ID DC_DATE CPI Previous_ID Previous_DC_Date Readmit_Days
1 "1/1/2012" a
2 "1/2/2012" b
3 "1/3/2012" c
4 "1/4/2012" d
5 "2/2/2012" a 1 "1/1/2012" 32
6 "2/1/2012" b 2 "1/2/2012" 30
7 "2/3/2012" e
8 "2/4/2012" f
9 "2/5/2012" g
10 "2/29/2012" a 5 "2/2/2012" 27
with encounters as (
select 1 id, to_date('01/01/2012', 'MM/DD/YYYY') dc_date, 'a' cpi from dual union all
select 2, to_date('01/02/2012', 'MM/DD/YYYY'), 'b' from dual union all
select 3, to_date('01/03/2012', 'MM/DD/YYYY'), 'c' from dual union all
select 4, to_date('01/04/2012', 'MM/DD/YYYY'), 'd' from dual union all
select 5, to_date('02/02/2012', 'MM/DD/YYYY'), 'a' from dual union all
select 6, to_date('02/01/2012', 'MM/DD/YYYY'), 'b' from dual union all
select 7, to_date('02/03/2012', 'MM/DD/YYYY'), 'e' from dual union all
select 8, to_date('02/04/2012', 'MM/DD/YYYY'), 'f' from dual union all
select 9, to_date('02/05/2012', 'MM/DD/YYYY'), 'g' from dual union all
select 10, to_date('02/29/2012', 'MM/DD/YYYY'), 'a' from dual)
select id, dc_date, cpi, previous_id, previous_dc_date, dc_date - previous_dc_date readmit_days
from
(select id, dc_date, cpi,
max(id) over (partition by cpi order by id range between unbounded preceding and 1 preceding) as previous_id,
max(dc_date) over (partition by cpi order by dc_date rows between unbounded preceding and 1 preceding) as previous_dc_date
from encounters);
分析功能在这里更好。在查询中,您会进行很多额外的相关查询。
PS第二个窗口(使用dc_date和“行”窗口)将无法正常使用领带。您可以在此处使用“范围”和间隔。这只是一个例子。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句