Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 перебор все комбинаций с условиями  [new]
irvy
Guest
здравствуйте.
помогите, пожалуйста, решить такую задачу: надо заполнить #t2 всеми возможными комбинациями из #t1 (wt(n) и id(n)) с группировкой по cntr и lt, при условии, что сумма wt1+wt2+wt3+wt4+wt5 должна быть между 50-60 или wt5 и id5 - пусто, а сумма wt1+wt2+wt3+wt4 также между 50 и 60 (50<=sum<=60). повторяться в #t2 значения не должны.
+ исходные данные

create table #t1 (id int identity(1,1), wt numeric(5,2), cntr int, lt int)

insert into #t1
	select 15.5, 100, 10 union all
	select 12.5, 100, 10 union all
	select 18.2, 100, 10 union all
	select 13.0, 100, 10 union all
	select 15.1, 100, 10 union all
	select 11.5, 100, 10 union all
	select 16.5, 100, 10 union all
	select 12.0, 100, 10 union all
	select 18.1, 100, 10 union all
	select 12.2, 100, 10 union all
	select 15.5, 100, 10 union all
	select 12.5, 100, 10 union all
	select 15.2, 100, 10 union all
	select 17.0, 100, 10 union all
	select 15.1, 100, 10 union all
	select 16.8, 100, 10 union all
	select 16.5, 100, 10 union all
	select 12.0, 100, 10 union all
	select 11.1, 100, 10 union all
	select 12.2, 100, 10 union all
	select 11.5, 101, 11 union all
	select 12.2, 101, 11 union all
	select 16.0, 101, 11 union all
	select 15.7, 101, 11 union all
	select 12.5, 101, 11 union all
	select 16.2, 101, 11 union all
	select 12.8, 101, 11 union all
	select 11.0, 101, 11 union all
	select 11.5, 101, 11 union all
	select 12.2, 101, 11 union all
	select 16.0, 101, 11 union all
	select 15.7, 101, 11 union all
	select 12.5, 101, 11 union all
	select 16.2, 101, 11 union all
	select 12.8, 101, 11 union all
	select 11.0, 101, 11 union all
	select 17.0, 101, 12 union all
	select 12.3, 101, 12 union all
	select 11.7, 101, 12 union all
	select 15.1, 101, 12 union all
	select 11.2, 101, 12 union all
	select 10.8, 101, 12 union all
	select 11.0, 101, 12 union all
	select 12.5, 101, 12 union all
	select 17.0, 101, 12 union all
	select 12.3, 101, 12 union all
	select 11.7, 101, 12 union all
	select 15.1, 101, 12 union all
	select 11.2, 101, 12 union all
	select 10.8, 101, 12 union all
	select 11.0, 101, 12 union all
	select 13.4, 101, 12 


create table #t2 (
	wt1 numeric(5,2), id1 int,
	wt2 numeric(5,2), id2 int,
	wt3 numeric(5,2), id3 int,
	wt4 numeric(5,2), id4 int,
	wt5 numeric(5,2), id5 int,
	sumwt numeric(8,2), cntr int, lt int)

25 дек 13, 12:24    [15344517]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
irvy
Guest
версию сервера забыла указать: 2005
25 дек 13, 12:40    [15344634]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
Добрый Э - Эх
Guest
Прочитав несколько раз постановку вопроса , так и подмывало ответить, что у тебя ошибка в 17-й строке ДНК, а ответ на твой вопрос - 42.
Но решил пройти мимо... :)
25 дек 13, 12:44    [15344662]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
irvy
Guest
Добрый Э - Эх,

Спасибо за вашу искреннюю доброту.
Погуглив, поняла, что это больше похоже на задачу о ранце.
Т.е. в #t2 (wt(n) и id(n)) нужно разместить все комбинации из #t1, например:

wt1 id1 wt2 id2 wt3 id3 wt4 id4 wt5 id5 sumwt cntr lt
15.5 1 12.5 2 18.2 3 13.0 4 null null 59.2 100 10
15.5 1 12.5 2 13.0 4 15.1 5 11.5 6 67.6 100 10
Поля: wt1,id1,wt2,id2,wt3,id3,wt4,id4 - точно должны быть заполнены, а wt4,id4 могут остаться пустыми, при этом сумма wt(n) должна быть (50<=sum<=60). При этом из разных cntr и lt нельзя данные смешивать, то есть по ним группировать.
25 дек 13, 13:04    [15344820]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
irvy
Guest
блин, ошибочка вышла:
Поля: wt1,id1,wt2,id2,wt3,id3,wt4,id4 - точно должны быть заполнены, а wt5,id5 могут остаться пустыми...
25 дек 13, 13:06    [15344836]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
irvy
Guest
поспешишь - ....
в тот примере, что я привела, нужно сделать поправку тогда, что сумма wt(n) должна быть (50<=sum<=70).
25 дек 13, 13:08    [15344861]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
Добрый Э - Эх
Guest
Что именно вызывает трудности?
Если нужно получить все комбинации чисел, то вот недавно решали такую задачу, может чем поможет.
25 дек 13, 13:10    [15344889]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
irvy
Guest
Добрый Э - Эх,

пока вызывает трудности - отсутствие знаний по sql'ю
пробовала с помощью рекурсий (cte), но пока вообще полнейшая ахинея, даже близко не похоже на то, что нужно
этот пример уже смотрела, но пока не осилила, пока еще пробую разобраться с cte вообще как с таковым
25 дек 13, 13:18    [15344961]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
Добрый Э - Эх
Guest
Давай уточнять условия решаемой задачи, ибо пока они не очень ясны...

1) Длина цепочки суммируемых значений... Цепочки должны содержать ровно 5 слагаемых? Или длина может быть произвольной, но не более пяти слагаемых?
2) Ограничения на сумму получившейся цепочки. На сумму должны накладываться некоторые ограничения (например: 50<=sum<=60)?
3) Все вычисления необходимо производить в разрезе cntr и lt. Для каждого сочетания cntr и lt производится своё независимое решение задачи (строятся все возможные цепочки, проверяются на доп условия, выводятся в итоговую выборку).
25 дек 13, 13:49    [15345230]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
irvy
Guest
Добрый Э - Эх
Давай уточнять условия решаемой задачи, ибо пока они не очень ясны...

1) Длина цепочки суммируемых значений... Цепочки должны содержать ровно 5 слагаемых? Или длина может быть произвольной, но не более пяти слагаемых?
2) Ограничения на сумму получившейся цепочки. На сумму должны накладываться некоторые ограничения (например: 50<=sum<=60)?
3) Все вычисления необходимо производить в разрезе cntr и lt. Для каждого сочетания cntr и lt производится своё независимое решение задачи (строятся все возможные цепочки, проверяются на доп условия, выводятся в итоговую выборку).


1) Простите, но я думала, что по структуре #t2 будет понятно. В цепочке должно быть 4-5 значений, то есть желательно, чтобы 5 значений, но если они не вписываются в сумму 50<=sum<=60, то можно сократить до 4, но не меньше.
2) Да, именно такие ограничения и должны быть
3) Да, именно так

и еще
4) Избежать повторяющихся значений, ну я имею ввиду, что: 1,2,3,4,5 и 2,1,3,4,5 - это одно и тоже, думаю вы поняли
25 дек 13, 14:36    [15345570]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
Добрый Э - Эх
Guest
Бери за основу запрос из ссылки. Так как у тебя допускаются дубли весов (в том плане, что в исходных данных одно и то же значение WT встречается более одного раза в рамках одной пары cntr и lt), то предварительно перенумеруй записи при помощи ROW_NUMBER-а (с заданной разбивкой по cntr, lt). Далее придется подпилить рекурсивный СТЕ: в условие соединения якорных элементов и рекурсивной части добавь свои cntr и lt. Когда дерево всех комбинаций будет построено, ограничь длину ветвей нужными тебе значениями (4 и 5). Далее выбирай лишь те ветви, сумма элементов которых укладывается в рамки от 50 до 60.
25 дек 13, 15:27    [15345951]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
SFlash
Member

Откуда:
Сообщений: 143
Добрый Э - Эх
Бери за основу запрос из ссылки. Так как у тебя допускаются дубли весов (в том плане, что в исходных данных одно и то же значение WT встречается более одного раза в рамках одной пары cntr и lt), то предварительно перенумеруй записи при помощи ROW_NUMBER-а (с заданной разбивкой по cntr, lt). Далее придется подпилить рекурсивный СТЕ: в условие соединения якорных элементов и рекурсивной части добавь свои cntr и lt. Когда дерево всех комбинаций будет построено, ограничь длину ветвей нужными тебе значениями (4 и 5). Далее выбирай лишь те ветви, сумма элементов которых укладывается в рамки от 50 до 60.


Покачиваясь... Помедленнее, я записываю ))))
25 дек 13, 16:10    [15346263]     Ответить | Цитировать Сообщить модератору
 Re: перебор все комбинаций с условиями  [new]
Добрый Э - Эх
Guest
irvy, вот небольшая затравочная зарисовочка для дальнейшего размышления...

Из минусов:
1) результат выдает не в том виде, в каком требуется, но это относительно легко решается:
  • джойном результата на исходную таблицу, с последующим разворотом получившегося набора
  • работой со строками ("нашинковать" "слепленные" поля - list_id и sum_wt_str - по-элементно),
  • "распилом" дерева на ветки (ну или на "бамбуковую рощу"), с последующим разворотом ветвей в горизонтальное положение.
    2) есть дубликаты по суммам, с одинаковыми слагаемыми, но разным порядком их следования. Но они возникают не от перестановок одних и тех же весов в сумме, а от наличия дублей по весам в разных строках (то есть проблема не в том, что запрос собирает такие варианты строк: a+b+c+d или b+a+c+d. проблема в том, что некоторые a = d или b = c ). Тоже можно обойти, но нужно думать - как именно
  • 26 дек 13, 07:19    [15348170]     Ответить | Цитировать Сообщить модератору
     Re: перебор все комбинаций с условиями  [new]
    Мистер Хенки
    Member

    Откуда: канализация
    Сообщений: 6615
    Я извиняюсь, а какие обьемы данных собираемся методом перебора обрабатывать? Что то мне подсказывает, что сложность задачи N^5 .
    26 дек 13, 09:58    [15348444]     Ответить | Цитировать Сообщить модератору
     Re: перебор все комбинаций с условиями  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6723
    Какие-то финдеперсовые деревья.

    + Проще нужно
    DECLARE @Data TABLE(
    	ID		Int	IDENTITY PRIMARY KEY
    ,	[Group]		Int
    ,	[Weight]	Numeric(5,2)
    ,	UNIQUE	([Group],ID,[Weight])
    )
    INSERT @Data VALUES
     (10010,15.5)
    ,(10010,12.5)
    ,(10010,18.2)
    ,(10010,13.0)
    ,(10010,15.1)
    ,(10010,11.5)
    ,(10010,16.5)
    ,(10010,12.0)
    ,(10010,18.1)
    ,(10010,12.2)
    ,(10010,15.5)
    ,(10010,12.5)
    ,(10010,15.2)
    ,(10010,17.0)
    ,(10010,15.1)
    ,(10010,16.8)
    ,(10010,16.5)
    ,(10010,12.0)
    ,(10010,11.1)
    ,(10010,12.2)
    ,(10111,11.5)
    ,(10111,12.2)
    ,(10111,16.0)
    ,(10111,15.7)
    ,(10111,12.5)
    ,(10111,16.2)
    ,(10111,12.8)
    ,(10111,11.0)
    ,(10111,11.5)
    ,(10111,12.2)
    ,(10111,16.0)
    ,(10111,15.7)
    ,(10111,12.5)
    ,(10111,16.2)
    ,(10111,12.8)
    ,(10111,11.0)
    ,(10112,17.0)
    ,(10112,12.3)
    ,(10112,11.7)
    ,(10112,15.1)
    ,(10112,11.2)
    ,(10112,10.8)
    ,(10112,11.0)
    ,(10112,12.5)
    ,(10112,17.0)
    ,(10112,12.3)
    ,(10112,11.7)
    ,(10112,15.1)
    ,(10112,11.2)
    ,(10112,10.8)
    ,(10112,11.0)
    ,(10112,13.4)
    
    SELECT	D1.ID,D2.ID
    ,	D1.[Weight],D2.[Weight]
    ,	W2.[Weight]
    FROM	@Data	D1
    JOIN	@Data	D2 ON D2.[Group] = D1.[Group] AND D2.ID > D1.ID AND D2.[Weight] < 60 - D1.[Weight] CROSS APPLY (SELECT D1.[Weight] + D2.[Weight]) W2([Weight])
    WHERE	W2.[Weight] BETWEEN 50 AND 60
    
    SELECT	D1.ID,D2.ID,D3.ID
    ,	D1.[Weight],D2.[Weight],D3.[Weight]
    ,	W3.[Weight]
    ,	D1.[Group]
    FROM	@Data	D1
    JOIN	@Data	D2 ON D2.[Group] = D1.[Group] AND D2.ID > D1.ID AND D2.[Weight] < 60 - D1.[Weight] CROSS APPLY (SELECT D1.[Weight] + D2.[Weight]) W2([Weight])
    JOIN	@Data	D3 ON D3.[Group] = D1.[Group] AND D3.ID > D2.ID AND D3.[Weight] < 60 - W2.[Weight] CROSS APPLY (SELECT W2.[Weight] + D3.[Weight]) W3([Weight])
    WHERE	W3.[Weight] BETWEEN 50 AND 60
    
    SELECT	D1.ID,D2.ID,D3.ID,D4.ID
    ,	D1.[Weight],D2.[Weight],D3.[Weight],D4.[Weight]
    ,	W4.[Weight]
    ,	D1.[Group]
    FROM	@Data	D1
    JOIN	@Data	D2 ON D2.[Group] = D1.[Group] AND D2.ID > D1.ID AND D2.[Weight] < 60 - D1.[Weight] CROSS APPLY (SELECT D1.[Weight] + D2.[Weight]) W2([Weight])
    JOIN	@Data	D3 ON D3.[Group] = D1.[Group] AND D3.ID > D2.ID AND D3.[Weight] < 60 - W2.[Weight] CROSS APPLY (SELECT W2.[Weight] + D3.[Weight]) W3([Weight])
    JOIN	@Data	D4 ON D4.[Group] = D1.[Group] AND D4.ID > D3.ID AND D4.[Weight] < 60 - W3.[Weight] CROSS APPLY (SELECT W3.[Weight] + D4.[Weight]) W4([Weight])
    WHERE	W4.[Weight] BETWEEN 50 AND 60
    
    SELECT	D1.ID,D2.ID,D3.ID,D4.ID,D5.ID
    ,	D1.[Weight],D2.[Weight],D3.[Weight],D4.[Weight],D5.[Weight]
    ,	W5.[Weight]
    ,	D1.[Group]
    FROM	@Data	D1
    JOIN	@Data	D2 ON D2.[Group] = D1.[Group] AND D2.ID > D1.ID AND D2.[Weight] < 60 - D1.[Weight] CROSS APPLY (SELECT D1.[Weight] + D2.[Weight]) W2([Weight])
    JOIN	@Data	D3 ON D3.[Group] = D1.[Group] AND D3.ID > D2.ID AND D3.[Weight] < 60 - W2.[Weight] CROSS APPLY (SELECT W2.[Weight] + D3.[Weight]) W3([Weight])
    JOIN	@Data	D4 ON D4.[Group] = D1.[Group] AND D4.ID > D3.ID AND D4.[Weight] < 60 - W3.[Weight] CROSS APPLY (SELECT W3.[Weight] + D4.[Weight]) W4([Weight])
    JOIN	@Data	D5 ON D5.[Group] = D1.[Group] AND D5.ID > D4.ID AND D5.[Weight] < 60 - W4.[Weight] CROSS APPLY (SELECT W4.[Weight] + D5.[Weight]) W5([Weight])
    WHERE	W5.[Weight] BETWEEN 50 AND 60
    
    SELECT	D1.ID,D2.ID,D3.ID,D4.ID,D5.ID,D6.ID
    ,	D1.[Weight],D2.[Weight],D3.[Weight],D4.[Weight],D5.[Weight],D6.[Weight]
    ,	W6.[Weight]
    ,	D1.[Group]
    FROM	@Data	D1
    JOIN	@Data	D2 ON D2.[Group] = D1.[Group] AND D2.ID > D1.ID AND D2.[Weight] < 60 - D1.[Weight] CROSS APPLY (SELECT D1.[Weight] + D2.[Weight]) W2([Weight])
    JOIN	@Data	D3 ON D3.[Group] = D1.[Group] AND D3.ID > D2.ID AND D3.[Weight] < 60 - W2.[Weight] CROSS APPLY (SELECT W2.[Weight] + D3.[Weight]) W3([Weight])
    JOIN	@Data	D4 ON D4.[Group] = D1.[Group] AND D4.ID > D3.ID AND D4.[Weight] < 60 - W3.[Weight] CROSS APPLY (SELECT W3.[Weight] + D4.[Weight]) W4([Weight])
    JOIN	@Data	D5 ON D5.[Group] = D1.[Group] AND D5.ID > D4.ID AND D5.[Weight] < 60 - W4.[Weight] CROSS APPLY (SELECT W4.[Weight] + D5.[Weight]) W5([Weight])
    JOIN	@Data	D6 ON D6.[Group] = D1.[Group] AND D6.ID > D5.ID AND D6.[Weight] < 60 - W5.[Weight] CROSS APPLY (SELECT W5.[Weight] + D6.[Weight]) W6([Weight])
    WHERE	W6.[Weight] BETWEEN 50 AND 60
    
    Динамически сгенерить набор запросов, скорость которых будет максимальной.
    Кто на прологе решал хотя бы школьные задачки сразу увидит, банальщина.
    26 дек 13, 14:36    [15350375]     Ответить | Цитировать Сообщить модератору
     Re: перебор все комбинаций с условиями  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6723
    В один запрос:
    SELECT	D1.ID,D2.ID,D3.ID,D4.ID,D5.ID,D6.ID
    ,	D1.[Weight],D2.[Weight],D3.[Weight],D4.[Weight],D5.[Weight],D6.[Weight]
    ,	W6.[Weight]
    ,	D1.[Group]
    FROM		@Data	D1
    LEFT	JOIN	@Data	D2 ON D2.[Group] = D1.[Group] AND D2.ID > D1.ID AND D2.[Weight] <= 60 - D1.[Weight] CROSS APPLY (SELECT D1.[Weight] + D2.[Weight]) W2([Weight])
    LEFT	JOIN	@Data	D3 ON D3.[Group] = D1.[Group] AND D3.ID > D2.ID AND D3.[Weight] <= 60 - W2.[Weight] CROSS APPLY (SELECT W2.[Weight] + D3.[Weight]) W3([Weight])
    LEFT	JOIN	@Data	D4 ON D4.[Group] = D1.[Group] AND D4.ID > D3.ID AND D4.[Weight] <= 60 - W3.[Weight] CROSS APPLY (SELECT W3.[Weight] + D4.[Weight]) W4([Weight])
    LEFT	JOIN	@Data	D5 ON D5.[Group] = D1.[Group] AND D5.ID > D4.ID AND D5.[Weight] <= 60 - W4.[Weight] CROSS APPLY (SELECT W4.[Weight] + D5.[Weight]) W5([Weight])
    LEFT	JOIN	@Data	D6 ON D6.[Group] = D1.[Group] AND D6.ID > D5.ID AND D6.[Weight] <= 60 - W5.[Weight] CROSS APPLY (SELECT W5.[Weight] + D6.[Weight]) W6([Weight])
    WHERE	D1.[Weight] BETWEEN 50 AND 60
    OR	W2.[Weight] BETWEEN 50 AND 60
    OR	W3.[Weight] BETWEEN 50 AND 60
    OR	W4.[Weight] BETWEEN 50 AND 60
    OR	W5.[Weight] BETWEEN 50 AND 60
    OR	W6.[Weight] BETWEEN 50 AND 60
    
    Тут конечно "немного" неправильно. Но в этих данных это не видно.
    Может быть что условие срабатывает одновременно и для N и N+1 вариантов, т.к. W(N+1) < 10
    26 дек 13, 15:10    [15350675]     Ответить | Цитировать Сообщить модератору
     Re: перебор все комбинаций с условиями  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6723
    + Правильный вариант в один запрос
    DECLARE @Data TABLE(
    	ID		Int	IDENTITY UNIQUE
    ,	[Group]		Int
    ,	[Weight]	Numeric(5,2)
    ,	UNIQUE	([Group],ID,[Weight])
    )
    INSERT @Data VALUES
     (NULL ,NULL)
    ,(10010,15.5)
    ,(10010,12.5)
    ,(10010,18.2)
    ,(10010,13.0)
    ,(10010,15.1)
    ,(10010,11.5)
    ,(10010,16.5)
    ,(10010,12.0)
    ,(10010,18.1)
    ,(10010,12.2)
    ,(10010,15.5)
    ,(10010,12.5)
    ,(10010,15.2)
    ,(10010,17.0)
    ,(10010,15.1)
    ,(10010,16.8)
    ,(10010,16.5)
    ,(10010,12.0)
    ,(10010,11.1)
    ,(10010,12.2)
    ,(10111,11.5)
    ,(10111,12.2)
    ,(10111,16.0)
    ,(10111,15.7)
    ,(10111,12.5)
    ,(10111,16.2)
    ,(10111,12.8)
    ,(10111,11.0)
    ,(10111,11.5)
    ,(10111,12.2)
    ,(10111,16.0)
    ,(10111,15.7)
    ,(10111,12.5)
    ,(10111,16.2)
    ,(10111,12.8)
    ,(10111,11.0)
    ,(10112,17.0)
    ,(10112,12.3)
    ,(10112,11.7)
    ,(10112,15.1)
    ,(10112,11.2)
    ,(10112,10.8)
    ,(10112,11.0)
    ,(10112,12.5)
    ,(10112,17.0)
    ,(10112,12.3)
    ,(10112,11.7)
    ,(10112,15.1)
    ,(10112,11.2)
    ,(10112,10.8)
    ,(10112,11.0)
    ,(10112,13.4)
    
    SELECT	D1.ID,D2.ID,D3.ID,D4.ID,D5.ID,D6.ID
    ,	D1.[Weight],D2.[Weight],D3.[Weight],D4.[Weight],D5.[Weight],D6.[Weight]
    ,	D1.[Weight],W2.[Weight],W3.[Weight],W4.[Weight],W5.[Weight],W6.[Weight]
    ,	D1.[Group]
    FROM		@Data	D1
    LEFT	JOIN	@Data	D2 ON D2.[Group] = D1.[Group] AND D2.ID > D1.ID AND D2.[Weight] <= 60 - D1.[Weight] OR D2.ID IS NULL AND D1.[Weight] >= 50 CROSS APPLY (SELECT D1.[Weight] + D2.[Weight]) W2([Weight])
    LEFT	JOIN	@Data	D3 ON D3.[Group] = D1.[Group] AND D3.ID > D2.ID AND D3.[Weight] <= 60 - W2.[Weight] OR D3.ID IS NULL AND W2.[Weight] >= 50 CROSS APPLY (SELECT W2.[Weight] + D3.[Weight]) W3([Weight])
    LEFT	JOIN	@Data	D4 ON D4.[Group] = D1.[Group] AND D4.ID > D3.ID AND D4.[Weight] <= 60 - W3.[Weight] OR D4.ID IS NULL AND W3.[Weight] >= 50 CROSS APPLY (SELECT W3.[Weight] + D4.[Weight]) W4([Weight])
    LEFT	JOIN	@Data	D5 ON D5.[Group] = D1.[Group] AND D5.ID > D4.ID AND D5.[Weight] <= 60 - W4.[Weight] OR D5.ID IS NULL AND W4.[Weight] >= 50 CROSS APPLY (SELECT W4.[Weight] + D5.[Weight]) W5([Weight])
    LEFT	JOIN	@Data	D6 ON D6.[Group] = D1.[Group] AND D6.ID > D5.ID AND D6.[Weight] <= 60 - W5.[Weight] OR D6.ID IS NULL AND W5.[Weight] >= 50 CROSS APPLY (SELECT W5.[Weight] + D6.[Weight]) W6([Weight])
    WHERE	D1.[Weight] BETWEEN 50 AND 60
    OR	W2.[Weight] BETWEEN 50 AND 60
    OR	W3.[Weight] BETWEEN 50 AND 60
    OR	W4.[Weight] BETWEEN 50 AND 60
    OR	W5.[Weight] BETWEEN 50 AND 60
    OR	W6.[Weight] BETWEEN 50 AND 60
    
    26 дек 13, 15:29    [15350851]     Ответить | Цитировать Сообщить модератору
     Re: перебор все комбинаций с условиями  [new]
    irvy
    Guest
    Mnior,

    Спасибо!
    пробовала разобраться, но если не ошибаюсь, то здесь далеко не все комбинации перебираются.
    27 дек 13, 13:35    [15355077]     Ответить | Цитировать Сообщить модератору
     Re: перебор все комбинаций с условиями  [new]
    irvy
    Guest
    irvy
    Mnior,

    Спасибо!
    пробовала разобраться, но если не ошибаюсь, то здесь далеко не все комбинации перебираются.


    Простите, я ошибалась
    27 дек 13, 14:01    [15355317]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить