【问题标题】:Get Min value of each group in a table based on another col根据另一个列获取表中每个组的最小值
【发布时间】:2017-01-02 12:45:40
【问题描述】:

我有以下格式的表格(按位置和月份/日期划分的产品成本),并希望在成本发生变化时获取 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 条记录。

【问题讨论】:

  • select cost, loc, prod, min(changeDate) from your_table group by cost, loc, prod
  • @juergend 只会获得 first 时间成本达到每个值。例如。在上面的数据中,它两次达到 1.223。
  • @MANDROID,您真的希望两行的 1.223 值都为 2010-01-03 吗?
  • 对于 2012 之前的 sql server 版本,您可以使用不同的行号(例如 row_number() over (order by x) - row_number() over (partition by cost order by x)

标签: sql sql-server row-number


【解决方案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

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多