SQL Self子查询改进

沙球

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_DAYSReadmit_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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章