根据另一个列获取 table 中每个组的最小值

Get Min value of each group in a table based on another col

我有以下格式的 table(按位置和 month/date 计算的产品成本),并希望在成本发生变化时获得最小的 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 条记录。

您可以使用 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