如何获得每个月的最短日期六个月?

时间:2013-03-25 09:58:50

标签: sql oracle plsql

我有这样的数据。

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。

我需要延长每个月的最小日期(过去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

- 很抱歉要求直接排队。我不知道该怎么做。这就是我没有准备/发布任何查询的原因。

3 个答案:

答案 0 :(得分: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 :(得分: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');

答案 2 :(得分: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'))