Sql 聚合不同行中的值
我有这样的数据表Sql 聚合不同行中的值,sql,sql-server,sql-server-2016,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
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
编辑:根据Gordon的答案,只需获得最小值或最大值就更容易了。但是,如果每个组都需要min、max和sum以及其他聚合,则此版本会更好。这可以通过行号差异方法完成。查看内部查询的结果,该查询将具有相同值的连续行划分为一个组,该组可用于获得最终结果
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
编辑:根据Gordon的答案,只需获得最小值或最大值就更容易了。但是,如果每个组都需要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;
您需要下一行具有不同值的行:
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])
不确定您是要在希望每天的最大日期时间值的位置执行基本聚合,还是要在定义组的位置执行孤岛和间隙问题,因为前一行更改了值。但我认为你只需要基本的聚合 下面是一个完全有效的示例,它返回您声明的所需输出
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])
那么你想要每天的最长日期?那么你想要每天的最长日期?亲爱的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。。你所说的输出分解是什么意思?输出与新数据不符亲爱的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。。你所说的输出故障是什么意思?新数据的输出是错误的看看这里