Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 聚合不同行中的值_Sql_Sql Server_Sql Server 2016 - Fatal编程技术网

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。。你所说的输出故障是什么意思?新数据的输出是错误的看看这里