declare @t table
(
id int,
SomeNumt int
)
insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23
select * from @t
Приведенный выше выбор возвращает мне следующее.
id SomeNumt
1 10
2 12
3 3
4 15
5 23
Как мне получить следующее:
id srome CumSrome
1 10 10
2 12 22
3 3 25
4 15 40
5 23 63
Ответы:
Пример SQL Fiddle
Вывод
Изменить: это обобщенное решение, которое будет работать на большинстве платформ БД. Когда есть лучшее решение для вашей конкретной платформы (например, Gareth), используйте его!
источник
Последняя версия SQL Server (2012) позволяет следующее.
или
Это еще быстрее. Разбитая версия завершается за 34 секунды более 5 миллионов строк для меня.
Спасибо Песо, который прокомментировал поток SQL Team, упомянутый в другом ответе.
источник
ROWS UNBOUNDED PRECEDING
вместоROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.SUM(COUNT(*)) OVER (ORDER BY RowId ROWS UNBOUNDED PRECEDING) AS CumulativeSum
. Для меня не было сразу очевидно, сработает ли это, но этоДля SQL Server 2012 и более поздних версий это может быть легко:
потому что
ORDER BY
предложениеSUM
по умолчанию означаетRANGE UNBOUNDED PRECEDING AND CURRENT ROW
рамку окна («Общие замечания» по адресу https://msdn.microsoft.com/en-us/library/ms189461.aspx )источник
Версия CTE, просто для удовольствия:
Возвращает:
источник
Давайте сначала создадим таблицу с фиктивными данными ->
здесь я присоединяюсь к той же таблице (SELF Joining)
РЕЗУЛЬТАТ:
здесь мы идем теперь просто суммируем Somevalue t2, и мы получим ответ
Желаемый результат
Очистить dummytable
источник
rank()
и еще один порядок за предложением для ее решения.Поздний ответ, но еще одна возможность ...
Генерация накопленной суммы может быть более оптимизирована с помощью
CROSS APPLY
логики.Работает лучше, чем
INNER JOIN
&OVER Clause
когда анализируется фактический план запроса ...источник
set io statistics on
и сравните процессор и фактическое время.Select *, (Select SUM(SOMENUMT) From @t S Where S.id <= M.id) From @t M
источник
correlated subquery
для каждой строки набора результатов, сканируя все больше и больше строк. Он не ведет промежуточный итог и сканирует данные один раз, как могут оконные функции.В этом превосходном посте доступна намного более быстрая реализация CTE: http://weblogs.sqlteam.com/mladenp/archive/2009/07/28/SQL-Server-2005-Fast-Running-Totals.aspx
Проблема в этой теме может быть выражена так:
источник
Вы можете использовать этот простой запрос для прогрессивного расчета:
источник
Как только таблица создана -
источник
Выше (до SQL12) мы видим такие примеры:
Более эффективным...
источник
Попробуй это
источник
Попробуй это:
источник
Решение SQL, которое сочетает в себе «строки между незанятым PRECEDING и CURRENT ROW», и «SUM» сделали именно то, что я хотел достичь. Спасибо вам большое!
Если это может кому-нибудь помочь, вот мой случай. Я хотел накапливать +1 в столбце всякий раз, когда создатель определяется как «Some Maker» (пример). Если нет, то нет приращения, но отображается предыдущий результат приращения.
Итак, этот кусок SQL:
Позволил мне получить что-то вроде этого:
Объяснение выше: счетчик "Some Maker" начинается с 0, Some Maker найден, и мы делаем +1. Для пользователя 1 MakerC найден, поэтому мы не делаем +1, но вместо этого вертикальный отсчет Some Maker привязывается к 2 до следующего ряда. Разделение выполняется пользователем, поэтому, когда мы меняем пользователя, кумулятивный счет возвращается к нулю.
Я на работе, я не хочу никаких заслуг в этом ответе, просто скажите спасибо и покажите мой пример на случай, если кто-то окажется в такой же ситуации. Я пытался объединить SUM и PARTITION, но удивительный синтаксис «ROWS МЕЖДУ UNBOUNDED PRECEDING И CURRENT ROW» выполнил задачу.
Спасибо! Groaker
источник
Без использования какого-либо типа совокупной заработной платы JOIN для человека, полученного с помощью следующего запроса:
источник
Например, если у вас есть таблица с двумя столбцами, один из которых является идентификатором, а второй - числом, и вы хотите узнать совокупную сумму.
источник