T-SQL Multiple grouping

后端 未结 5 854
野性不改
野性不改 2021-01-13 13:46

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           


        
5条回答
  •  被撕碎了的回忆
    2021-01-13 14:25

    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.

提交回复
热议问题