2016-06-21 67 views
1

我有如下表皮卡最后和倒数第二个日期如何使用Oracle查询

表产品:

PRO_ID PRO_Date PRO_Price 
123  1/1/2016 2000 
123  2/1/2016 2500 
123  3/1/2016 1500 
123  5/1/2016 3000 
456  1/1/2016 2000 
456  2/1/2016 2500 
456  3/1/2016 1500 
456  5/1/2016 3000 
456  6/1/2016 3500 

查询目前正在使用:目前越来越

select PRO_ID, max(PRO_DATE) as Last_PRO_Date 
from 
(select PRO_ID, PRO_DATE from PRODUCT where PRO_DATE<='01-JUN-2016') 
group by PRO_ID 

输出:

PRO_ID Last_PRO_Date 
123  5/1/2016  
456  6/1/2016  

但现在我还希望获取可用的第二个最后日期。

预期输出/所需的输出:

PRO_ID Last_PRO_Date Second_Last_PRO_Date 
123  5/1/2016  3/1/2016 
456  6/1/2016  5/1/2016 

回答

2

您可以在不子查询编写查询:

select PRO_ID, MAX(PRO_DATE) as Last_PRO_Date 
from PRODUCT 
where PRO_DATE <= '01-JUN-2016' 
group by PRO_ID; 

然而,对于前两个日期,我会用dense_rank()和聚集:

select PRO_ID, 
     max(casse when seqnum = 1 then PRO_DATE end) as Last_PRO_Date, 
     max(casse when seqnum = 2 then PRO_DATE end) as Second_Last_PRO_Date 
from (select PRO_ID, PRO_DATE, 
      dense_rank() over (partition by PRO_ID order by PRO_DATE desc) as seqnum 
     from PRODUCT 
     where PRO_DATE <= '01-JUN-2016' 
    ) t 
group by PRO_ID; 
+0

感谢它的工作完美 – Qasim0787