Вы можете использовать рекурсию с генератором, предоставляя условие для проверки текущего значения накопленной суммы:
Решение с представлением демонстрационной строки:
def pairs(a, b, _l, _c = []):
if len(_c) == _l:
yield _c
else:
if a:
for i in b:
yield from pairs(a[1:], b, _l, _c=_c+[f'{a[0]}+{i}'])
yield from pairs(a[1:], b, _l, _c= _c+[a[0]])
print(list(pairs([1, 2, 3], [0.5, 1], 3)))
Выход:
[ 111]Решение с добавлением и сокращением:
def pairs(a, b, _l, _c = [], _sum=0):
if len(_c) == _l:
yield _c
else:
if a:
for i in b:
if a[0]+i+_sum < 8:
yield from pairs(a[1:], b, _l, _c=_c+[a[0]+i], _sum=_sum+a[0]+i)
if a[0]+_sum < 8:
yield from pairs(a[1:], b, _l, _c= _c+[a[0]], _sum=_sum+a[0])
print(list(pairs([1, 2, 3], [0.5, 1], 3, _sum=0)))
Вывод:
[[1.5, 2.5, 3.5], [1.5, 2.5, 3], [1.5, 2.5, 3], [1.5, 2, 3.5], [1.5, 2, 3], [1.5, 2, 4], [1.5, 2, 3], [1.5, 3, 3], [1.5, 3, 3], [1.5, 2, 3.5], [1.5, 2, 3], [1.5, 2, 4], [1.5, 2, 3], [1, 2.5, 3.5], [1, 2.5, 3], [1, 2.5, 4], [1, 2.5, 3], [1, 2, 3.5], [1, 2, 3], [1, 2, 4], [1, 2, 3], [1, 3, 3.5], [1, 3, 3], [1, 3, 3], [1, 2, 3.5], [1, 2, 3], [1, 2, 4], [1, 2, 3], [2, 2.5, 3], [2, 2.5, 3], [2, 2, 3.5], [2, 2, 3], [2, 2, 3], [2, 2, 3.5], [2, 2, 3], [2, 2, 3], [1, 2.5, 3.5], [1, 2.5, 3], [1, 2.5, 4], [1, 2.5, 3], [1, 2, 3.5], [1, 2, 3], [1, 2, 4], [1, 2, 3], [1, 3, 3.5], [1, 3, 3], [1, 3, 3], [1, 2, 3.5], [1, 2, 3], [1, 2, 4], [1, 2, 3]]
Редактирование: указание нижней границы:
def pairs(a, b, _l, _c = [], _sum=0):
if len(_c) == _l:
if _sum > 2:
yield _c
else:
if a:
for i in b:
if a[0]+i+_sum < 8:
yield from pairs(a[1:], b, _l, _c=_c+[a[0]+i], _sum=_sum+a[0]+i)
if a[0]+_sum < 8:
yield from pairs(a[1:], b, _l, _c= _c+[a[0]], _sum=_sum+a[0])
print(list(pairs([1, 2, 3], [-1, 1], 3, _sum=0)))
Вывод: [1112 ]
[[0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 1, 3], [0, 2, 2], [0, 2, 3], [0, 2, 4], [0, 2, 3], [0, 3, 2], [0, 3, 3], [0, 3, 4], [0, 3, 3], [0, 2, 2], [0, 2, 3], [0, 2, 4], [0, 2, 3], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 1, 3], [1, 2, 2], [1, 2, 3], [1, 2, 4], [1, 2, 3], [1, 3, 2], [1, 3, 3], [1, 3, 3], [1, 2, 2], [1, 2, 3], [1, 2, 4], [1, 2, 3], [2, 1, 2], [2, 1, 3], [2, 1, 4], [2, 1, 3], [2, 2, 2], [2, 2, 3], [2, 2, 3], [2, 3, 2], [2, 2, 2], [2, 2, 3], [2, 2, 3], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 1, 3], [1, 2, 2], [1, 2, 3], [1, 2, 4], [1, 2, 3], [1, 3, 2], [1, 3, 3], [1, 3, 3], [1, 2, 2], [1, 2, 3], [1, 2, 4], [1, 2, 3]]
Другой вариант - запустить три отдельных запроса и объединить их вместе. В зависимости от вашего индекса и структуры таблицы это может привести к более эффективному SQL, чем объединение предложений в предложении WHERE или использование операторов CASE, хотя это будет чисто игровой оптимизатор.
Я бы протестировал все три подхода. и выберите тот, который лучше всего вам подходит.
Как насчет:
WHERE
interval_start <= CASE mode
WHEN 0 THEN '9999-12-31'
WHEN 1 THEN GETDATE()
WHEN 2 THEN GETDATE() - interval_period
END