【问题标题】:aggregate value in different rows不同行中的聚合值
【发布时间】:2017-12-18 16:20:57
【问题描述】:

我有这个表这样的数据

ItemId  Value   Date
1        2      2017-12-18 17:00:00.000
1        2      2017-12-18 17:02:00.000
1        2      2017-12-18 17:04:00.000
1        3      2017-12-18 17:06:00.000
1        3      2017-12-18 17:08:00.000
1        2      2017-12-20 17:10:00.000
1        2      2017-12-20 17:12:00.000

我想在sql server中这样输出

ItemId     Value   MaxDate

1          2       2017-12-18 17:04:00.000
1          3       2017-12-18 17:08:00.000
1          2       2017-12-20 17:12:00.000

对不起,我的标题没有更好的句子

【问题讨论】:

  • 所以你想要每天的最大日期?

标签: sql sql-server sql-server-2016


【解决方案1】:

这可以通过不同的行号方法来完成。查看内部查询的结果,将具有相同值的连续行分类为一组,可用于获得最终结果。

select itemid,value,max(date)
from (
select t.*,
row_number() over(partition by itemid order by date)
-row_number() over(partition by itemid,value order by date) as grp
from tbl t
) t
group by itemid,value,grp

编辑:只要得到minmax 会更容易与戈登的回答。但是,如果每个组都需要minmaxsum 以及其他聚合,则此版本会更好。

【讨论】:

  • 亲爱的 Vamsi Prabhala 我添加了一行 ItemId = 1 , Value = 4 和 Date = 2017-12-18 17:12:00.000 并且我编辑了最后一行日期 2017-12-18 17:12: 00.000 到 2017-12-18 17:14:00.000 输出中断,你能帮我解决这个变化吗?
  • @HoseinMasoomi .. 输出故障是什么意思?
  • 输出错误,新数据看这里stackoverflow.com/questions/47887679/…
【解决方案2】:

您想要下一行具有不同值的行:

select t.*
from (select t.*,
             lead(value) over (partition by itemid order by date) as next_value
      from t
     ) t
where next_value is null or next_value <> value;

【讨论】:

    【解决方案3】:

    不确定您是在尝试进行基本聚合,希望每天获得最大日期时间值,还是尝试解决由于“上一个”行更改值而定义组的孤岛和间隙问题。但我认为你只需要基本的聚合。

    这是一个完整的示例,它返回你想要的输出。

    declare @Something table
    (
        ItemId int
        , Value int
        , [Date] datetime
    )
    insert @Something values
    (1, 2, '2017-12-18 17:00:00.000')
    , (1, 2, '2017-12-18 17:02:00.000')
    , (1, 2, '2017-12-18 17:04:00.000')
    , (1, 3, '2017-12-18 17:06:00.000')
    , (1, 3, '2017-12-18 17:08:00.000')
    , (1, 2, '2017-12-20 17:10:00.000')
    , (1, 2, '2017-12-20 17:12:00.000')
    
    select ItemId
        , Value
        , MaxDate = Max([Date])
    from @Something
    group by ItemId
        , Value
        , convert(Date, [Date])
    order by MAX([Date])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多