SQL Server находит сумму значений на основе критериев в другой таблице - PullRequest
0 голосов
/ 29 октября 2019

У меня есть таблица, состоящая из 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 результатов)минуту) и, вероятно, не лучшее решение.

Мой вопрос: есть ли способ получить результаты третьей таблицы без использования курсора / для цикла?

Ответы [ 3 ]

1 голос
/ 29 октября 2019

Во время группировки по сумме будет только для рассматриваемого идентификатора - поскольку минимальный год и максимальный год предназначены для самого идентификатора, вам не нужно дублировать запрос. Запрос ниже должен дать вам именно то, что вам нужно. Если у вас другое требование, дайте мне знать.

SELECT ID, MIN(YEAR) as MinYear, MAX(YEAR) as MaxYear, SUM(VALUE) as SUMVALUE
FROM tablenameyoudidnotsay
GROUP BY ID
0 голосов
/ 29 октября 2019

Вы можете использовать запрос, как показано ниже. TableA - это ваша первая таблица, а TableB - вторая.

SELECT *,
(select SUM(Value) FROM TableA where tablea.ID=TableB.ID AND tableA.Year BETWEEN 
TableB.MinYear AND TableB.MaxYear) AS SumValue
from TableB
0 голосов
/ 29 октября 2019

Вы можете поместить свои критерии в объединение и получить результат как один набор, который должен быть быстрее:

SELECT b.Id, b.MinYear, b.MaxYear, sum(a.Value)
FROM Table2 b
JOIN Table1 a ON a.Id=b.Id AND b.MinYear <= a.Year AND b.MaxYear >= a.Year
GROUP BY b.Id, b.MinYear, b.MaxYear
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...