我有像这张桌子的数据
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
对不起,我的头衔并没有得到更好的判罚
这可以通过行数方法的差异来完成。查看内部查询的结果,该结果将具有相同值的连续行分类到一个组中,该组可用于获取最终结果。
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
编辑:戈登的答案只是让min
或max
更容易。但是,如果每组都需要min
,max
和sum
以及其他聚合,那么这个版本会更好。
您希望下一行具有不同值的行:
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;
不确定您是否尝试进行基本聚合,您希望每天的最大日期时间值,或者您尝试在定义组时执行岛和间隙问题,因为“上一行”更改了值。但我认为你只需要基本的聚合。
这是一个完整的工作示例,它返回您想要的输出。
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])