不同行中的聚合值

时间:2017-12-18 16:20:58

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

我有像这张表这样的数据

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

对不起,我的标题没有得到更好的判决

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

onRowDataChanged

答案 2 :(得分: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])