不同行中的聚合值

问题描述 投票:0回答:3

我有像这张桌子的数据

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
3个回答
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以及其他聚合,那么这个版本会更好。


1
投票

您希望下一行具有不同值的行:

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;

1
投票

不确定您是否尝试进行基本聚合,您希望每天的最大日期时间值,或者您尝试在定义组时执行岛和间隙问题,因为“上一行”更改了值。但我认为你只需要基本的聚合。

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

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])
© www.soinside.com 2019 - 2024. All rights reserved.