SQL Server 2008 Sum и Select Max Only? - PullRequest
       14

SQL Server 2008 Sum и Select Max Only?

1 голос
/ 26 марта 2012

Я пытаюсь понять, как сделать сумму, когда мне нужно использовать только максимальные / максимальные значения для периода даты. Это похоже на SQL Server: ВЫБЕРИТЕ только строки с МАКС. (ДАТА) , но не точно. Спасибо за чтение.

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

1 Ответ

2 голосов
/ 27 марта 2012

Вам в основном нужно два выбора.Вы можете сделать либо внутренний выбор, либо 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 и затем использована для фильтрации результата суммирования.

...