1

当我只需要使用日期期间的最大值/最大值时,我试图了解如何进行求和。这有点像SQL Server:只选择具有 MAX(DATE) 的行,但不完全选择。谢谢阅读。

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 的行,因为它是旧一批数据的一部分。较新的行表示稍后的插入(所有记录时具有相同日期时间的值对于批次是相同的)

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

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
4

1 回答 1

2

你基本上需要两个选择。您可以进行内部选择或 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 中找到,然后用于过滤求和结果。

于 2012-03-26T20:15:40.660 回答