Home » SQL & PL/SQL » SQL & PL/SQL » Generating the Range for the given dates (Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production)
Generating the Range for the given dates [message #620064] Mon, 28 July 2014 09:29 Go to next message
saipradyumn
Messages: 419
Registered: October 2011
Location: Hyderabad
Senior Member
Hi All ,

Please help me to generate the range the dates if it is consecutive (continuous), other wise just need to display single date


drop table   test_date;

create table  test_date ( c_date date);

insert into test_date (C_DATE)
values (to_date('01-02-2003', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-04-2004', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-06-2005', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-04-2006', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-09-2006', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-12-2006', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-08-2007', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-11-2007', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-06-2008', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-09-2008', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-11-2008', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-12-2008', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-07-2014', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-07-2005', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-08-2005', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-09-2005', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-09-2007', 'dd-mm-yyyy'));

insert into test_date (C_DATE)
values (to_date('01-10-2007', 'dd-mm-yyyy'));

select  *  from test_date ;

Required out put  :  

Feb ,2013 
Apr , 2014
June,2005 - Sep- 2005
Apr , 2006
Sep, 2006
Dec,2006
Aug 2007 - Nov 2007



My Ides is need to apply the Lead functions. but unable to generate the of unique identifier for each set of consecutive rows


select c_date,
       nvl(lead(c_date) over(order by c_date), add_months(c_date, 1)) next_dt,
       case
         when add_months(c_date, 1) =
              nvl(lead(c_date) over(order by c_date), add_months(c_date, 1)) then
         -- row_number() over (order by 1)
         0
         else
         row_number() over (order by 1)
       end val
  from test_date
 order by c_date 




Thanks
Sai Pradyumn

[Updated on: Mon, 28 July 2014 10:00] by Moderator

Report message to a moderator

Re: Generating the Rage for the given dates [message #620065 is a reply to message #620064] Mon, 28 July 2014 09:38 Go to previous messageGo to next message
Lalit Kumar B
Messages: 3174
Registered: May 2013
Location: World Wide on the Web
Senior Member
Search for start_of_group method in this forum.
Re: Generating the Rage for the given dates [message #620067 is a reply to message #620064] Mon, 28 July 2014 09:59 Go to previous messageGo to next message
Michel Cadot
Messages: 68645
Registered: March 2007
Location: Nanterre, France, http://...
Senior Member
Account Moderator

SQL> with 
  2    data as (select distinct trunc(c_date,'MONTH') mnth from test_date),
  3    grouped as (
  4      select mnth,
  5             add_months(mnth,-row_number() over (order by mnth)) grp
  6      from data
  7    )
  8  select to_char(min(mnth),'MM/YYYY') || 
  9           decode(max(mnth),min(mnth),'', '-'||to_char(max(mnth),'MM/YYYY'))
 10           range
 11  from grouped
 12  group by grp
 13  order by grp
 14  /
RANGE
---------------
02/2003
04/2004
06/2005-09/2005
04/2006
09/2006
12/2006
08/2007-11/2007
06/2008
09/2008
11/2008-12/2008
07/2014

Re: Generating the Rage for the given dates [message #620076 is a reply to message #620067] Mon, 28 July 2014 11:10 Go to previous messageGo to next message
saipradyumn
Messages: 419
Registered: October 2011
Location: Hyderabad
Senior Member

Thanks Michel
Re: Generating the Rage for the given dates [message #620078 is a reply to message #620076] Mon, 28 July 2014 11:12 Go to previous messageGo to next message
Lalit Kumar B
Messages: 3174
Registered: May 2013
Location: World Wide on the Web
Senior Member
Don't mind me, but did you search and try yourself for start_of_group method?

Edit : typo

[Updated on: Mon, 28 July 2014 11:13]

Report message to a moderator

Re: Generating the Range for the given dates [message #620085 is a reply to message #620064] Mon, 28 July 2014 12:26 Go to previous message
Solomon Yakobson
Messages: 3273
Registered: January 2010
Location: Connecticut, USA
Senior Member
Hierarchical query solution:

select  connect_by_root to_char(c_date,'FMMonth, YYYY') ||
        case when level > 1 then to_char(c_date,' - FMMonth, YYYY') end range
  from  test_date t1
  where connect_by_isleaf = 1
  start with not exists (select 1 from test_date t2 where t2.c_date = add_months(t1.c_date,-1))
  connect by c_date = add_months(prior c_date,1)
  order by c_date
/

RANGE
-------------------------------
February, 2003
April, 2004
June, 2005 - September, 2005
April, 2006
September, 2006
December, 2006
August, 2007 - November, 2007
June, 2008
September, 2008
November, 2008 - December, 2008
July, 2014

11 rows selected.

SQL> 


SY.
Previous Topic: How to use distinct with 2nd column to display desired output
Next Topic: Short-Circuit Evaluation operators in oracle
Goto Forum:
  


Current Time: Fri Apr 26 00:27:57 CDT 2024