Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Группировка с накоплением результата  [new]
Kudep
Member

Откуда: From Russia
Сообщений: 146
Всем привет,

Есть вот такой запрос:

declare @potatos table(id bigint, created_date date, shop_id bigint)
declare @potatos_ids table(id bigint)
declare @shop_ids table(id bigint)

insert into @potatos_ids values(1), (2), (3), (4), (5), (6), (7), (8), (9)
insert into @shop_ids values(1), (2), (3), (4), (5), (6), (7), (8), (9)

insert into @potatos
select s.id * 1000 + p.id * 100 + p2.id * 10 + p3.id, DATEADD(month, -p3.id, GETDATE()), p2.id
from @potatos_ids p
cross join @shop_ids s
cross join @potatos_ids p2
cross join @potatos_ids p3

;with groupped_potatos as(
	select o.shop_id, MONTH(o.created_date) as potato_month, COUNT(*) as potatos_count
	from @potatos o
	where o.created_date >= '2012-01-01'
		and o.created_date <= '2012-12-31'
		group by o.shop_id, MONTH(o.created_date)
)

select	
	g.*,
	(
		select SUM(g2.potatos_count) from groupped_potatos g2
		where g2.potato_month >= 1
		and g2.potato_month <= g.potato_month
		and g2.shop_id = g.shop_id
		group by g2.shop_id
	) as accumulated_count
from groupped_potatos g
order by g.potato_month

Т.е. нужно сгруппировать по shop_id в разрезе по месяцам с накоплением результата.
Сейчас этот запрос работает очень медленно. Подскажите, какие еще есть варианты накопления результата?
22 фев 13, 16:14    [13967883]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с накоплением результата  [new]
aleks2
Guest
Ну, запихни groupped_potatos во временную таблицу.
А то у тя финальный запрос хрен знает скока группировок выполняет.
22 фев 13, 16:18    [13967910]     Ответить | Цитировать Сообщить модератору
 Re: Группировка с накоплением результата  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Kudep,

Если у вас SQL Server 2012, то там есть вычисление накопительных итогов при помощи SUM() OVER(ORDER BY).

Если версия ниже, то накопительные итоги — один из немногих случаев, когда курсор или цикл оказывается быстрее, чем один запрос. Смотрите, например, здесь: Hidden RBAR: Triangular Joins и здесь: Calculate a Running Total in SqlServer. Самое быстрое решение по второй ссылке (то, которое Test 4) — не является надёжным (воспроизводимость результатов не гарантирована), лучше использовать решение из Test 3.
22 фев 13, 17:06    [13968151]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить