0

アクティブな参加者の最新のメモを教えてくれるクエリを実行しています。

select notes.applicant_id,
   reg.program_code,
   reg.last_name,
   reg.first_name,
   reg.status_cd,
   MAX(notes.service_date) as "Last Note"
from reg inner join notes on reg.applicant_id=notes.applicant_id
where reg.status_cd='AC'
group by notes.applicant_id, reg.program_code, 
         reg.last_name, reg.first_name, reg.reg_date, 
         reg.region_code, reg.status_cd
order by MAX(notes.service_date)

note.service_dateしかし、このクエリで最大値の直前の結果も取得したいと思いますservice_date

結果は次のようになります

notes.applicant_id   reg.last_name  reg.first_name reg.status_cd  Last Note    Prior Note
 12345                 Johnson          Lori           AC        01-NOV-2011   01-OCT-2011

私はオラクルで働いています。

4

2 に答える 2

1

関数を使用するlagか、同じテーブルと結合できます。

より簡単な例を次に示します (データ サンプルは提供されていません)。

create table t as
(select level as id, mod(level , 3) grp, sysdate - level dt
from dual 
connect by level < 100
)

そしてここにクエリがあります:

select t2.grp,t1.grp, max(t1.dt) mdt, max(t2.dt) pdt
  from t t1
  join t t2 on t1.dt < t2.dt and t1.grp = t2.grp
 group by t2.grp, t1.grp;

また

select grp, max(pdt), max(dt)
 from(
 select grp, lag(dt) over (partition by grp order by dt) pdt, dt 
 from t)
 group by grp

ここにフィドルがあります


あなたの場合、それは次のようなものかもしれません:

select t.applicant_id, t.program_code, 
         t.last_name, t.first_name, t.reg_date, 
         t.region_code, t.status_cd,
         max(t.dt) as "Last Note",
         max(t.pdt) as "Prev Note"
from (
select notes.applicant_id,
   reg.program_code,
   reg.last_name,
   reg.first_name,
   reg.status_cd,
   notes.service_date as dt,
   lag(notes.service_date)  over (partition by notes.applicant_id,
   reg.program_code,
   reg.last_name,
   reg.first_name,
   reg.status_cd order by notes.service_date) as pdt
from reg inner join notes on reg.applicant_id=notes.applicant_id
where reg.status_cd='AC'
) t
group by t.applicant_id, t.program_code, 
         t.last_name, t.first_name, t.reg_date, 
         t.region_code, t.status_cd
order by MAX(t.dt)
于 2012-11-05T14:26:40.370 に答える
0

私があなたを正しく理解している場合、これを行う1つの方法は次のとおりです。

SELECT *
  FROM (select notes.applicant_id,
               reg.program_code,
               reg.last_name,
               reg.first_name,
               reg.status_cd,
               notes.service_date AS "Last Note",
               ROW_NUMBER() OVER (PARTITION BY notes.applicant_id, reg.program_code, 
                   reg.last_name, reg.first_name, reg.reg_date, reg.region_code, 
                   reg.status_cd ORDER BY notes.service_date DESC) rn
          from reg inner join notes on reg.applicant_id=notes.applicant_id
         where reg.status_cd='AC')
 WHERE rn < 3;
于 2012-11-05T14:33:57.740 に答える