I have follwing data :
Product Price StartDate EndDate
Apples 4.9 2010-03-01 00:00:00.000 2010-03-01 00:00:00.000
Apples 4.9
My approach.
Data:
create table t ( producte varchar(50),
price money,
start_date date,
end_date date);
insert into t values
( 'apple', 4.9, '2012-01-01', '2012-01-01' ),
( 'apple', 4.9, '2012-01-02', '2012-01-02' ),
( 'apple', 8, '2012-01-04', '2012-01-04' ),
( 'cat', 5, '2012-01-01', '2012-01-01' ),
( 'cat', 6, '2012-01-02', '2012-01-02' ),
( 'cat', 6, '2012-01-03', '2012-01-03' );
Query:
with start_dates as (
select
t.producte, t.price, t.start_date, t.end_date, t.start_date as gr_date
from
t left outer join
t t1 on
t.price = t1.price and --new
t.producte = t1.producte and
t.start_date = dateadd(day,1, t1.end_date )
where t1.producte is null
union all
select
t.producte, t.price, t.start_date,t. end_date, gr_date
from
t inner join
start_dates t1 on
t.price = t1.price and --new
t.producte = t1.producte and
t.start_date = dateadd(day,1, t1.end_date )
)
select t.producte, t.price , min( t.start_date ), max( t.end_date )
from start_dates t
group by t.producte, gr_date ,t.price
Results:
| PRODUCTE | PRICE | COLUMN_2 | COLUMN_3 |
----------------------------------------------
| apple | 4.9 | 2012-01-01 | 2012-01-02 |
| apple | 8 | 2012-01-04 | 2012-01-04 |
| cat | 5 | 2012-01-01 | 2012-01-01 |
| cat | 6 | 2012-01-02 | 2012-01-03 |
Explanation
This is a recursive CTE expression. Base query take inital dates for each group of prices. Recursive query looks for last data with this price.