У меня есть таблица, состоящая из ID, Год, Значение
---------------------------------------
| ID | Year | Value |
---------------------------------------
| 1 | 2006 | 100 |
| 1 | 2007 | 200 |
| 1 | 2008 | 150 |
| 1 | 2009 | 250 |
| 2 | 2005 | 50 |
| 2 | 2006 | 75 |
| 2 | 2007 | 65 |
---------------------------------------
Затем я создаю производную агрегированную таблицу, состоящую из ID, MinYear и MaxYear
---------------------------------------
| ID | MinYear | MaxYear |
---------------------------------------
| 1 | 2006 | 2009 |
| 2 | 2005 | 2007 |
---------------------------------------
Iзатем хочу найти сумму значений между MinYear и MaxYear foreach ID в агрегированной таблице, но у меня возникают проблемы с определением правильного запроса.
Финальная таблица должна выглядеть примерно так
----------------------------------------------------
| ID | MinYear | MaxYear | SumVal |
----------------------------------------------------
| 1 | 2006 | 2009 | 700 |
| 2 | 2005 | 2007 | 190 |
----------------------------------------------------
Прямо сейчас я могу выполнить все объединения, чтобы создать вторую таблицу. Но затем я использую курсор ускоренной перемотки вперед для перебора каждой записи второй таблицы с кодом внутри цикла for, который выглядит следующим образом
DECLARE @curMin int
DECLARE @curMax int
DECLARE @curID int
FETCH Next FROM fastCursor INTo @curISIN, @curMin , @curMax
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT Sum(Value) FROM ValTable WHERE Year >= @curMin and Year <= @curMax and ID = @curID
Group By ID
FETCH Next FROM fastCursor INTo @curISIN, @curMin , @curMax
Найдя сумму значений между указанными годами, я могу подключитьсяя возвращаюсь ко второй таблице, и я получаю желаемый результат (третья таблица).
Однако вторая таблица на самом деле занимает примерно 4 миллиона строк, поэтому эта итерация занимает очень много времени (~ генерация 300 результатов)минуту) и, вероятно, не лучшее решение.
Мой вопрос: есть ли способ получить результаты третьей таблицы без использования курсора / для цикла?