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 expression of CTE. The base query takes into account the effective dates for each price group. A recursive query looks for the latest data with this price.