Максимальная сумма для непрерывных N строк - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть следующая таблица (оба значения A и B являются целыми числами):

Обновление 1 - Кто-нибудь может оказать мне услугу и запустить решение на множестве1M записей, где B - случайное десятичное число (чтобы избежать переполнения), находящееся в диапазоне от [0 до 1] для N => 10, 100 и 1000?Я хотел бы получить представление о времени, необходимом для запуска запроса решения.Заранее большое спасибо.

Пример данных:

A   B
1   1
2   8
3   1
4   11
5   1
6   1
7   6
8   1
9   1
10  2

Как получить максимальную сумму B значений для любых последовательных N A?Решение не должно использовать курсоры, использование таблиц vars / tem должно быть строго оправдано.

Я могу использовать SQLCLR в случае, если он даст отчетливый прирост производительности.

Некоторыепояснения:

  • Максимальная сумма для 1 элемента равна 11 (см. A = 4)
  • Максимальная сумма для 2 элементов равна 12 (это либо A => 1 & 2, либо A =>2 и 3),
  • Максимальная сумма для 3 элементов равна 20 (A => 2, 3, 4),
  • Максимальная сумма для 4 составляет 21 (A => 1,2,3, 4 или A => 2,3,4,5) и т. Д.

Ответы [ 4 ]

2 голосов
/ 16 декабря 2011

Поскольку значения A гарантированно являются последовательными целыми числами, учитывая, что N мы знаем для любого конкретного A, какие значения нас интересуют. Поэтому

SELECT
    A,
    (SELECT SUM(B) FROM Table T2 WHERE T.A <= T2.A AND T2.A <= T.A + N - 1) 
        AS SumOfBs
FROM Table T
WHERE A + N - 1 <= (SELECT COUNT(*) FROM Table)

дает для каждого A, сумма значений B для строк N, начинающихся там.WHERE ограничивает нас строками, которые действительно имеют строки N, начинающиеся там.Поместите это в подзапрос, и мы можем получить максимум:

SELECT 
    MAX(SumOfBs) AS DesiredValue
FROM
(
    SELECT
        A,
        (SELECT SUM(B) FROM Table T2 WHERE T.A <= T2.A AND T2.A <= T.A + N - 1) 
            AS SumOfBs
    FROM Table T
    WHERE A + N - 1 <= (SELECT COUNT(*) FROM Table)
) Intermediate

должен выполнить эту работу.

1 голос
/ 16 декабря 2011

Попробуйте:

with cte as 
(select 1 window_count union all
 select window_count+1 window_count from cte where window_count<@N)
select max(sum_B) from
(select T1.A,
       sum(T2.B) sum_B
 from MyTable T1
 cross join cte
 join MyTable T2 on T1.A = T2.A + cte.window_count - 1
 group by T1.A) sq
1 голос
/ 16 декабря 2011

Я загрузил ваши тестовые данные в таблицу с именем data.

Следующий SQL дает мне ответ 20 для N = 3:

declare @N int
set @N = 3

select max(SumB)
from data d
cross apply (select SumB = SUM(B) from data sub where sub.A between d.A - (@N-1) and d.A) x
0 голосов
/ 16 декабря 2011

Возможно, я не совсем понимаю вопрос, но мне он кажется ...

SELECT SUM(B) FROM table WHERE A <= n

Если не правильно, вы можете объяснить немного больше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...