2012-03-26 11 views
1

Я пытаюсь понять, как делать Sum, когда мне нужно использовать только значения Max/top для периода даты. Это вроде как SQL Server: SELECT only the rows with MAX(DATE), но не совсем. Спасибо за прочтение.SQL Server 2008 Sum и выберите только Max?

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 значения с одинаковыми DateTime являются одинаковыми для выпечки)

Таким образом, если новая строка была вставлена ​​так:

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 

ответ

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 

Обратите внимание, что максимальная дата партия находится в КТР, а затем используется для фильтрации результата суммирования.

+0

Это выглядит великолепно. Все еще пытаясь понять, почему вы добавили предложение Where вместо добавления дополнительного условия Join, есть ли там оптимизация, которую я не вижу? – Snowy

+0

Я полагаю, что оба будут производить один и тот же план выполнения. Мне просто было полезно использовать предложение 'where'. – Joel

+0

Ты потрясающий. Благодарю. – Snowy

Смежные вопросы