Проблема пересмотрена по комментариям
Скажем, у нас есть следующие целочисленные идентификаторы и числа ...
id count
1 0
2 10
3 0
4 0
5 0
6 1
7 9
8 0
У нас также есть переменная @id_range int
.
Учитывая значение для @id_range
, как мы можем выбрать все комбинации диапазонов id без использования циклов или курсоров while, которые удовлетворяют следующим критериям?
1) Никакие два диапазона в комбинации не могут перекрываться (минимальный и максимальный значения каждого диапазона включены)
2) sum(count)
для комбинации диапазонов должно равняться sum(count)
исходного набора данных (в нашем случае 20)
3) Включить только диапазоны, в которых sum(count)
> 0
Простейший случай будет, когда @id_range = max(id) - min(id)
или 7 с учетом приведенных выше данных. В этом случае есть только одно решение:
minId maxId count
---------------------
1 8 20
Но если, например, @id_range = 1
, будет 4 возможных решения:
Решение 1:
minId maxId count
---------------------
1 2 10
5 6 1
7 8 9
Решение 2:
minId maxId count
---------------------
1 2 10
6 7 10
Решение 3:
minId maxId count
---------------------
2 3 10
5 6 1
7 8 9
Решение 4:
minId maxId count
---------------------
2 3 10
6 7 10
Конечная цель - определить, какие решения имеют наименьшее количество диапазонов (решения № 2 и 4, в приведенном выше примере, где @id_range = 1
).