2012-11-05 109 views
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 

我在甲骨文工作。

+0

如果您使用的是Oracle,請標記問題因此。 –

+0

您正在嘗試混合聚合值和非聚合值... – YXD

回答

1

您可以使用lag函數,或將它與同一個表結合使用。

下面是一個簡單的例子(你有沒有givven我們數據樣本):

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 

Here是小提琴


你的情況可能是這樣的:

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) 
+0

我沒有能力創建表格。我只能檢索數據。 – user1466935

+0

@ user1466935,你不需要創建表格 - 這只是一個簡單的例子。在**你的**表上使用相同的想法。查看答案的答案 –

+0

是的是的...它的工作!非常感謝你的幫助。 – user1466935

0

如果我理解正確的話,這裏是應該做的一種方式:

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; 
+0

作品!謝謝!我從來沒有想過使用行和分區。 – user1466935

+0

反正可以通過notes.applicant.id把所有這些放在一行中嗎?現在我看到每個人都有2行信息,如果我能看到它,那將是非常棒的。 – user1466935