Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
mod
Member

Откуда:
Сообщений: 2318
Завис над запросом. Есть таблица table1. В таблице есть внешние ключи id1, id2, id3
id1 - некая группа. id2-член группы. Есть таблица table2 (id2- член группы, id3 - некий параметр)
необходимо вытащить все возможные комбинации всех параметров членов группе.
например если в группе два члена (1,2) у первого члена 1 параметр A , у члена 2 - B,C....
Получим сочетания AB и AC. Ещё пример: три члена - 1(a,b),2(c,d),3(e,f). Получим: ace,acf,ade,adf,bce,bcf,bde,bdf
28 мар 08, 10:35    [5471431]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Alexes
Member

Откуда:
Сообщений: 1100
А для чего нужен id3 в table1?
28 мар 08, 12:11    [5472360]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
mod
Member

Откуда:
Сообщений: 2318
id1- группа, id2 - член группы, id3 - признак...
комбинации признаков и надо перебирать... в рамках группы у всех её членов... за раз по одному признаку... потом - на следующем шаге будет поиск лучшей комбинации... но там с расчётами
28 мар 08, 15:42    [5473992]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
CROSS JOIN ?
28 мар 08, 15:43    [5474001]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Тогда зачем id3 нужен в table2?
И что такое ace, acf и т.д? Текстовые строки или что?
28 мар 08, 16:31    [5474379]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
Если бы вопрос был оформлен согласно Рекомендациям по оформлению сообщений на форуме (особенно п.6), то было бы понятней (и приятней упражняться в поиске решения)
28 мар 08, 16:38    [5474431]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Лень регистрироваться
Guest
Задачка хорошая, понравилось (это если я правильно понял, что требуется автору).
В процессе решения узнал пару новых для меня вещей об общих табличных выражениях :)

declare @a table (GroupId int, MemberId int)
declare @b table (MemberId int, Val varchar(10))
insert @a select 1, 1
insert @a select 1, 2
insert @a select 1, 3
insert @a select 2, 1
insert @a select 2, 3
insert @b select 1, 'a'
insert @b select 1, 'b'
insert @b select 1, 'k'
insert @b select 2, 'c'
insert @b select 2, 'd'
insert @b select 3, 'e'
insert @b select 3, 'f'
 
declare @GroupId int
set @GroupId = 1
 
;with cte1 as
(
  select
    MemberId,
    ( select min(a1.MemberId)
      from @a a1
      where a1.MemberId > a.MemberId and a1.GroupId = @GroupId
    ) as NextMemberId
  from @a a
  where GroupId = @GroupId
),
cte as
(
  select top 1 with ties
    b.MemberId,
    cast(b.Val as varchar(max)) as Val
  from @a a
    inner join @b b on a.MemberId = b.MemberId
  where a.GroupId = @GroupId
  order by a.MemberId
 
  union all
 
  select
    b.MemberId,
    cte.Val + b.Val
  from @a a
    inner join @b b on a.MemberId = b.MemberId
    inner join cte on a.MemberId = (select NextMemberId from cte1 where cte.MemberId = te1.MemberId)
  where a.GroupId = @GroupId
)
select top 1 with ties Val
from cte
order by MemberId desc
29 мар 08, 00:05    [5475757]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
mod
Member

Откуда:
Сообщений: 2318
Вроде даже с примерами дал... Cross Join не катит... Ещё раз - id3 именно то, сочетания чего нужно получить... id1 - группы сочетаний, id2 - участники сочетаний(id3- их свойства). Что
4 апр 08, 10:18    [5502574]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
mod
Member

Откуда:
Сообщений: 2318
сложность в том что надо через select
4 апр 08, 10:18    [5502577]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
mod
Вроде даже с примерами дал... Cross Join не катит...

Хорошее утверждение. Главное, что трудно оспорить. Ввиду отсутствия аргументов
4 апр 08, 12:01    [5503380]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
mod
Member

Откуда:
Сообщений: 2318
Вопрос закрыт. Пошёл другим путём...
4 апр 08, 15:15    [5504898]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
И подпись - В.И.Ленин
4 апр 08, 15:16    [5504908]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
mod
Member

Откуда:
Сообщений: 2318
Другим путём пойти не удалось... Надо продолжать этот
При этом выяснилось следующее:
Рекурсивный запрос не подходит, т.к. ряд серверов на Win2000. Придётся через хранимые процедуры. Идея добавить поле в table2(combination - комбинация) и расширять таблицу... Но вот как?
11 апр 08, 16:44    [5535669]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Вайландт Артем
Member

Откуда:
Сообщений: 4
Помогите сделать перебор сочетаний на SQL?

Задача:
Есть таблица с ID ПК и количеством слотов памяти:
ПК / кол
ПК1 / 2
ПК2 / 2
ПК3 / 3
ПК4 / 4

Есть таблица с наименованиями и количеством планок:
Память / размер / шт
DDR / 128 / 22
DDR / 256 / 15
DDR / 512 / 9
DDR / 1024 / 1000 (ставим большое количество - так как эти планки будут закупаться, ими мы будем "добивать" компьютеры)

Надо "заполнить" компьютеры планками памяти так, чтобы общий объем был не менее 1024 в каждом(параметр задаваемый будет). Причем начать надо с наименьших планок. Например, компьютер с 4мя слотами, пробуем:
128/128/128/128 = 512 - проверяем что сумма >= 1024 - не верно, пробуем
128/128/128/256 = 640 - проверяем что сумма >= 1024 - не верно, пробуем
128/128/256/256 = 768 - проверяем что сумма >= 1024 - не верно, пробуем
128/256/256/256 = 869 - проверяем что сумма >= 1024 - не верно, пробуем
256/256/256/256 = 1024 -проверяем что сумма >= 1024 - ВЕРНО, записываем

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

Должна получиться табличка вида (применительно к вышеуказанным компам):
ПК / слот1 / слот2 / слот3 / слот4
ПК1 / 512 / 512
ПК2 / 512 / 512
ПК3 / 512 / 256 / 256
ПК4 / 256 / 256 / 256 / 256

Если честно, я в SQL крайне плохо соображаю, умею только селекты и джойны делать)) если поможете буду ОЧЕНЬ БЛАГОДАРЕН!!!

PS если все получится опубликую статью на хабрахабре как и чем динамически я собираю отчет с компьютеров, формирую требования к закупке и как потом это все системные администраторы расставляют по компам) и о тех кто помогал при создании конечно же упомяну!
21 сен 12, 07:31    [13199538]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=453885&pg=-1

Но это так медленно работает в SQL...
Не для этого он, не для этого.
21 сен 12, 09:20    [13199780]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
aleks2
Guest
Вайландт Артем
Помогите сделать перебор сочетаний на SQL?


Если честно, я в SQL крайне плохо соображаю, умею только селекты и джойны делать)) если поможете буду ОЧЕНЬ БЛАГОДАРЕН!!!


1. Да, ваш работодатель зря платит вам зряплату.
2. За одно ЭТО
Вайландт Артем
128/128/128/128 = 512 - проверяем что сумма >= 1024 - не верно, пробуем

вас следовало уволить за "неполное служебное соответствие" по статье.

3. Нафега тут что-то ПЕРЕБИРАТЬ, если существует СЧЕТНОЕ количество вариантов заполнения для ваших условий?
21 сен 12, 10:15    [13200104]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Вайландт Артем
Member

Откуда:
Сообщений: 4
iap, спасибо, сейчас почитаю...

aleks2,

я предполагал что тут злые и не адекватные администраторы SQL сидят, но не думал что на столько.

Мой работодатель платит мне зарплату не за SQL и программирование.
Уверен, если начну про свои задачи рассказывать у Вас, молодой человек, мозг сплавится.
Но не будем разводить тут дискуссии на эту тему, слушать и обсуждать такие ответы не буду.
А если Вы решили умничать, так тут не юридический форум.
Помогите сделать и я Вам руку пожму.
Если не можете, то просто помолчите.
21 сен 12, 11:28    [13200603]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
aleks2
Guest
Вайландт Артем
я предполагал что тут злые и не адекватные администраторы SQL сидят, но не думал что на столько.

Глюпенький, тут сидят декларативные программисты.

Вайландт Артем
Уверен, если начну про свои задачи рассказывать у Вас, молодой человек, мозг сплавится.

Не верю. (с) Станиславский.
21 сен 12, 15:09    [13202879]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Привет гуманитариям.
Вайландт Артем
я предполагал что тут злые и не адекватные администраторы SQL сидят, но не думал что на столько.
Умора. Ну да, вам же важен тон, а не смысл. А то что вам привели веский аргумент глупости - так надо понять его ещё.
Вайландт Артем
Уверен, если начну про свои задачи рассказывать у Вас, молодой человек, мозг сплавится.
Упоси боже, на надо нам. Нам и так хватает от набегов поциентов.
Вайландт Артем
Но не будем разводить тут дискуссии на эту тему, слушать и обсуждать такие ответы не буду.
Ой, да не будем мы это, писать лишнего и заполнять мусором никому не интересными и ненужными комментариями, тратит на это время и писать ответы и накручивать счётчик слов и постов. и т.п..
Не не будет. Очень хороший комментарий спасибо. Пишите ещё.


Вайландт Артем
А если Вы решили умничать, так тут не юридический форум.
Ой точно, аргументы и комментарии и предложения по самой задаче писать не нужно. Нужно нам закрыть хлебало и выложить готовое решение.
Вайландт Артем
Помогите сделать и я Вам руку пожму.
От Спасибо, я только ради этого захожу на форум. Прям пожали руку и стало светло и радостно.
Вайландт Артем
Если не можете, то просто помолчите.
А если "не хочу"? Вы мне тоже будете рот затыкать?

Задачу перебора тут не причём, савсем, т.е. в принципе тему надо закрыть, а юзверя забанить за нарушения основных правил форума.

+ PS Пример, наработки
Какие могут быть комбинации планок:
DECLARE	 @PSs	Int	= 20
	,@Size	Int	= 1024
-- Вариант 1
;WITH Mem AS (SELECT * FROM (VALUES (128,22),(256,15),(512,9),(1024,100))M(Size,[Count]))
SELECT	 G.*,S.*
FROM	     Mem M1
	JOIN Mem M2 ON M2.Size >= M1.Size
	JOIN Mem M3 ON M3.Size >= M2.Size
	JOIN Mem M4 ON M4.Size >= M3.Size
	CROSS APPLY (SELECT * FROM
		(VALUES (M1.Size),(M2.Size),(M3.Size),(M4.Size))G(Size)
		PIVOT (Count(G.Size) FOR G.Size IN ([128],[256],[512],[1024])
	) P) G CROSS APPLY (SELECT
		 M1.Size + M2.Size + M3.Size + M4.Size
	) S(Size)
WHERE	S.Size >= @Size
--	ORDER BY        G.[128] DESC,G.[256] DESC,G.[512] DESC,G.[1024] DESC,S.Size
	ORDER BY S.Size,G.[128] DESC,G.[256] DESC,G.[512] DESC,G.[1024] DESC

-- Вариант 2
;WITH Mem ([128],[256],[512],[1024]) AS (SELECT 22,15,9,100)
,Slot AS (SELECT * FROM (VALUES (0),(1),(2),(3),(4))S(N))
SELECT	 M_128.N	AS  [128]
	,M_256.N	AS  [256]
	,M_512.N	AS  [512]
	,M1024.N	AS [1024]
	,S.Size
	,S.[Max]	-- Сколько максимум можно забить компов с даной комбинацией планок
FROM	     Slot M_128
	JOIN Slot M_256 ON M_256.N <= 4 - M_128.N
	JOIN Slot M_512 ON M_512.N <= 4 - M_128.N - M_256.N
	JOIN Slot M1024 ON M1024.N <= 4 - M_128.N - M_256.N - M_512.N
	CROSS APPLY (SELECT
		  M_128.N * 128	+ M_256.N * 256	+ M_512.N * 512	+ M1024.N *1024
		, M_128.N	+ M_256.N	+ M_512.N	+ M1024.N
		,(SELECT Min(C.[Count]) FROM Mem  M CROSS APPLY (VALUES
		 (M. [128] / NullIf(M_128.N,0))
		,(M. [256] / NullIf(M_256.N,0))
		,(M. [512] / NullIf(M_512.N,0))
		,(M.[1024] / NullIf(M1024.N,0)))C([Count]))
	) S(Size,[Count],[Max])
WHERE	S.Size >= @Size AND S.[Count] = 4
--	ORDER BY        M_128.N DESC,M_256.N DESC,M_512.N DESC,M1024.N DESC,S.Size
	ORDER BY S.Size,M_128.N DESC,M_256.N DESC,M_512.N DESC,M1024.N DESC
Если задача плавающая, то можно тупо подобрать по порядку (через CTE)
Но если надо найти комбинацию при котором надо закупить минимальное количество планок (1024), то скорее надо прокомбинировать. Лучше сгенерить скрипт запроса на основании этого.
21 сен 12, 18:27    [13204391]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
aleks2
Guest
Mnior
PS Пример, наработки

Пойду... напишу заявление шоб уволили.
21 сен 12, 19:20    [13204526]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше реальзовать перебор комбинаций в MS SQL?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
aleks2
Пойду... напишу заявление шоб уволили.
Sheet happens.
Не бери в голову.
21 сен 12, 22:28    [13205014]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить