Sql server 2008 SQL Server 2008求和并选择仅限最大值?

Sql server 2008 SQL Server 2008求和并选择仅限最大值?,sql-server-2008,max,row-number,Sql Server 2008,Max,Row Number,当我只需要在一个日期段内使用Max/top值时,我试图理解如何进行求和。这有点像,但不完全一样。谢谢你的阅读 declare @tbl Table ( tableid int , eventdate date, valuec char(5) , valued int , recordedwhen datetime2(3) ) insert into @tbl values ( 0 , '2012-03-22' , '11111' , 3 , '2012-03-23 17:21:01.083'

当我只需要在一个日期段内使用Max/top值时,我试图理解如何进行求和。这有点像,但不完全一样。谢谢你的阅读

declare @tbl Table ( tableid int , eventdate date,  valuec char(5) , valued int , recordedwhen datetime2(3) )
insert into @tbl values ( 0 , '2012-03-22' , '11111' , 3 , '2012-03-23 17:21:01.083' )
insert into @tbl values ( 1 , '2012-03-22' , '22222' , 3 , '2012-03-23 17:21:01.083' )
insert into @tbl values ( 2 , '2012-03-22' , '22222' , 4 , '2012-03-23 18:21:01.083' )
insert into @tbl values ( 3 , '2012-03-22' , '22222' , 5 , '2012-03-23 18:21:01.083' )

select 
        eventdate, valuec , sum(valued) as valuedSum , recordedwhen
        from 
        @tbl
        group by eventdate, valuec, recordedwhen
我有三排。但我真正想要的是:

--   
--   eventdate  valuec valuedSum   recordedwhen
--   ---------- ------ ----------- ----------------------
--   2012-03-22 11111  3           2012-03-23 17:21:01.08
--   2012-03-22 22222  9           2012-03-23 18:21:01.08
我不想要tableid=1的行,因为这是旧批数据的一部分。 较新的行表示较新的插入(当具有相同日期时间的值对于批处理相同时,所有recordedwhen)

因此,如果像这样插入新行:

insert into @tbl values ( 4 , '2012-03-22' , '22222' , 6 , '2012-03-24 18:21:01.083' )
--   eventdate  valuec valuedSum   recordedwhen
--   ---------- ------ ----------- ----------------------
--   2012-03-22 11111  3           2012-03-23 17:21:01.08
--   2012-03-22 22222  6           2012-03-24 18:21:01.08
那么数据应该是这样的:

insert into @tbl values ( 4 , '2012-03-22' , '22222' , 6 , '2012-03-24 18:21:01.083' )
--   eventdate  valuec valuedSum   recordedwhen
--   ---------- ------ ----------- ----------------------
--   2012-03-22 11111  3           2012-03-23 17:21:01.08
--   2012-03-22 22222  6           2012-03-24 18:21:01.08

你基本上需要两个选择。您可以执行内部选择或CTE。下面将产生您想要的结果

create table #tbl ( tableid int , eventdate date,  valuec char(5) , valued int , recordedwhen datetime2(3) )
insert into #tbl values ( 0 , '2012-03-22' , '11111' , 3 , '2012-03-23 17:21:01.083' )
insert into #tbl values ( 1 , '2012-03-22' , '22222' , 3 , '2012-03-23 17:21:01.083' )
insert into #tbl values ( 2 , '2012-03-22' , '22222' , 4 , '2012-03-23 18:21:01.083' )
insert into #tbl values ( 3 , '2012-03-22' , '22222' , 5 , '2012-03-23 18:21:01.083' )
insert into #tbl values ( 4 , '2012-03-22' , '22222' , 6 , '2012-03-24 18:21:01.083' )

;
with t (eventdate, valuec, maxrecordedwhen)
as (select eventdate, valuec, max(recordedwhen)
    from #tbl
    group by eventdate, valuec)
select t.eventdate, t.valuec, sum(valued) as valuedsum, maxrecordedwhen
from t
    join #tbl on t.eventdate = #tbl.eventdate and t.valuec = #tbl.valuec
where t.maxrecordedwhen = #tbl.recordedwhen
group by t.eventdate, t.valuec, t.maxrecordedwhen

drop table #tbl

请注意,在CTE中找到了最大批处理日期,然后用于过滤求和结果。

这看起来很棒。仍然在试图理解为什么添加Where子句而不是添加额外的连接条件,是否存在我没有看到的优化?我相信两者都会产生相同的执行计划。使用
where
子句对我来说很有意义。