Получить минимальное значение каждой группы в таблице на основе другого столбца

У меня есть таблица (Стоимость продукта по местоположению и месяцу / дате) в формате ниже, и я хочу получить Min of ChangeDate, когда стоимость изменилась.

Cost            Loc     Prod        ChangeDate
--------------------------------------------------------
1.223000000000  5678    12345678    2010-01-03 00:00:00
1.223000000000  5678    12345678    2010-01-31 00:00:00
1.223000000000  5678    12345678    2010-02-28 00:00:00
1.000000000000  5678    12345678    2010-04-04 00:00:00
1.223000000000  5678    12345678    2010-05-02 00:00:00
1.223000000000  5678    12345678    2010-05-30 00:00:00
1.223000000000  5678    12345678    2010-07-04 00:00:00
1.277200000000  5678    12345678    2010-08-01 00:00:00
1.277200000000  5678    12345678    2010-08-29 00:00:00
1.277200000000  5678    12345678    2010-10-03 00:00:00

Ожидаемый результат:

Cost           Loc  Prod     CostChangeStartDate
------------------------------------------------
1.223000000000 5678 12345678 2010-01-03 00:00:00
1.000000000000 5678 12345678 2010-04-04 00:00:00
1.223000000000 5678 12345678 2010-05-02 00:00:00
1.277200000000 5678 12345678 2010-08-01 00:00:00

Я попытался использовать Row_Number () Over (PartitionBy OrderBy), но проблема в том, что, поскольку Cost 1.223000000000 повторяется дважды, я не могу правильно разбить его, поэтому получаю только 3 записи.


person Mandroid    schedule 25.08.2016    source источник
comment
@juergend, который получит только первый раз, когда стоимость достигнет каждого значения. Например. В приведенных выше данных он дважды достигает 1,223.   -  person Blorgbeard    schedule 26.08.2016
comment
@MANDROID, вы действительно хотите, чтобы значение 1.223 было 2010-01-03 в обеих строках?   -  person Jeremy Fortune    schedule 26.08.2016
comment
для версий sql server до 2012 года вы можете использовать разницу в номерах строк (например, row_number() over (order by x) - row_number() over (partition by cost order by x))   -  person ZLK    schedule 26.08.2016


Ответы (1)


Вы можете получить строки, стоимость которых отличается от их предыдущей, используя LAG :

select * from (
    select *, lag(cost, 1) over (partition by Loc, Prod order by ChangeDate) prevCost
    from @products
) x
where prevCost is null or cost <> prevCost
person Blorgbeard    schedule 25.08.2016