Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ну, запихни groupped_potatos во временную таблицу. А то у тя финальный запрос хрен знает скока группировок выполняет. |
22 фев 13, 16:18 [13967910] Ответить | Цитировать Сообщить модератору |
Гость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 | ![]() |