2013-03-25 105 views
1

我有这样的数据。如何获得每个月的最短日期为六个月?

Process_date SEQ_No 
------------- --------- 
16-MAR-13 733 
09-MAR-13 732 
02-MAR-13 731 
24-FEB-13 730 
16-FEB-13 728 
09-FEB-13 727 
02-FEB-13 726 
26-JAN-13 725 
21-JAN-13 724 
12-JAN-13 723 
05-JAN-13 722 
29-DEC-12 721 
24-DEC-12 720 
15-DEC-12 719 
08-DEC-12 718 
03-DEC-12 717 
22-NOV-12 716 
17-NOV-12 715 
10-NOV-12 714 
03-NOV-12 713 
29-OCT-12 712 
23-OCT-12 711 
13-OCT-12 710 
05-OCT-12 709 
28-SEP-12 708 
22-SEP-12 707 
15-SEP-12 706 
08-SEP-12 705 
01-SEP-12 704 

每个月管理员都会刷新实际数据表,并自动将上面的表更新为唯一的seq_no和process_date。

我需要extarct每个月的最短日期(最近6个月的第一次刷新 - 不包括当前月份)以及与该月相关的seq_no所以使用连接(使用seq_no - 可在主表中)我可以结合实际数据。

我需要像结果:

02-MAR-13 731 (I don't need MAR as it should not take current month data) 

,所以我需要一个像下面的最终结果:

02-FEB-13 726 
05-JAN-13 722 
08-DEC-12 718 
03-NOV-12 713 
05-OCT-12 709 
01-SEP-12 704 

- 对不起询问直接quetion这样。我不知道该怎么做。那是我没有准备/发布任何查询的原因。

回答

2
select Process_date, SEQ_No 
    from (select Process_date, SEQ_No, 
       row_number() over (partition by trunc(process_date, 'mm') order by process_date) rn 
      from yourtab 
     where Process_date < trunc(sysdate, 'mm')) 
where rn = 1; 

会做

小提琴例如:http://sqlfiddle.com/#!4/a5452/1

1

我不明白怎么seq_no在另一个表... 但使用输入数据:

select 
    min(process_date), 
    min(seq_no) keep (dense_rank first order by process_date) 
from 
    your_table 
where 
    process_date between add_months(trunc(sysdate,'MM'),-7) 
        and last_day(add_months(sysdate, -1)) 
group by 
    trunc(process_date,'MM'); 
0

试试:

SELECT seq_no,process_date FROM my_table 
WHERE process_date IN (SELECT min(process_date) 
         FROM my_table 
         GROUP BY TRUNC(process_date,'MM')) 
+0

你应该闪回你的答案了一下。 – joce 2013-03-25 23:00:44

相关问题