Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2017, 19:12   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
понимаю сколько это будет, считал, но SQL справиться, столько он записывал, конечно на минут 15-20 подзавис, но выдал 19 млрд
Не понимаешь. 54 компа с двумя вариантами каждый дадут ~72*10^15 сочетаний. Это 72000 триллионов, ни один SQL и ни какое дерево не поможет ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.05.2017, 18:24   #12
Gurza-Alex
Пользователь
 
Регистрация: 22.04.2017
Сообщений: 16
По умолчанию

откуда вы эти формулы берете?
25827165-вот сколько их будет

http://ru.onlinemschool.com/math/ass...n/combination/

вот вам сайт, можете сами посмотреть...

Впринципе я сделал, но где-то ошибка закралась, повторы иногда выползают(

На работе в свободное время делал... Хотел показать, чтоб "Свежим взглядом" посмотрели и может быть увидели ошибку, но флешка подвела, поврежденный кластер, не скинуть... После выходных скину....
Просто заново запрос этот лень писать заново...
Gurza-Alex вне форума Ответить с цитированием
Старый 06.05.2017, 19:15   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А при чем здесь число сочетаний по 6 из 54? Считай количество размещений с повторениями из 2 элементов по 54, а это и есть 2^54. Коль по 6 вариантов, то 6^54 )) Это если следовать логике того, что изображено в первом посте. Там как раз и есть размещения с повторениями из 3 по 3, что есть 3^3. А не число сочетаний из 3 по 3. Заметь оно равно 1 ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.05.2017 в 19:23.
Аватар вне форума Ответить с цитированием
Старый 07.05.2017, 18:28   #14
Gurza-Alex
Пользователь
 
Регистрация: 22.04.2017
Сообщений: 16
По умолчанию

Ладно, пусть будет так, мне это надо для статистики, и чем больше будет, тем лучше...


Я тут набросал все таки.... Не дождался завтра...
Можно все выделять и проверять....
Код:

/*

create database proba


create table variants
(
id				uniqueidentifier primary key
,id_objects		smallint 
,variant		tinyint
)


create table var_ref
(
id				uniqueidentifier primary key
,id_objects		bigint 
,variant		bigint
,id_var			int
)

create table t
(id		int
,chek	bigint
)



insert into variants values(newid(),1,1)
insert into variants values(newid(),1,2)

insert into variants values(newid(),2,1)
insert into variants values(newid(),2,2)

insert into variants values(newid(),3,1)
insert into variants values(newid(),3,2)


*/

declare @count	int
set @count=1
while(@count<9)
begin
	declare @check_id_var int
	declare @check_n bigint
	declare @n	int
	declare @id_var	int
	declare @id int
	declare @var int
	declare @id_object int
	declare @v int
	set @id=1
	set @n=1
	declare @check	bigint
	declare @check1	bigint
	declare @id1 int
	select @id_object=max(id_objects) from variants
	select @id_var=max(id_var) from var_ref

	while(@id<@id_object+1)
	begin
		select @v=max(variant) from variants where id_objects=@id
		set @v=@v-1
		select @var=variant from variants where variant=ROUND(rand()*@v,0)+1

		insert into var_ref values(newid(),@id, @var,@count)

		set @id=@id+1
	end
	
SELECT @check_n=SUM(power(CHECKSUM(id_objects+11,variant+3),2)) from var_ref where id_var=@n
	if(@id_var is NULL)
		begin
			set @check_n=1
		end
SELECT @check_id_var=SUM(power(CHECKSUM(id_objects+11,variant+3),2)) from var_ref where id_var=@id_var


set @id_var=1

while (@id_var<9)
	begin
		SELECT @check_id_var=SUM(power(CHECKSUM(id_objects,variant),2)) from var_ref where id_var=@id_var
		insert into t values(@id_var,@check_id_var)
		set @id_var=@id_var+1
	end

set @id=1
while (@id<9)
	begin
	
		select @check=chek from t where id=@id
		set @id1=1
		while(@id1<9)
			begin
				select @check1=chek from t where id=@id1

			if(@check1=@check and @id<>@id1)
				begin
					delete var_ref where id_var=@id1
                                        delete t where id=@id1
					set @id1=@id1+1
				
					set @count=@count-1
		
				end
				set @id1=@id1+1
			end
		set @id=@id+1

	end

	set @count=@count+1

end



--select id_objects,variant,id_var from var_ref order by 3,1
Я тут за объект принял комп...
Тут можно количество разное ставить, я подумываю формулу туда вставить, чтоб сам высчитывал сколько ему раз нужно пройти цикл... Только пока минус в том, что повторы я удаляю, и получается не попарядку, а если вставить set @count=@count-1 , то он фигню какую-то делает, он попорядку идет, но иногда повторят номер...

Подскажите кто-нибудь, если увидите ошибку в мое коде...
Gurza-Alex вне форума Ответить с цитированием
Старый 10.05.2017, 21:03   #15
Gurza-Alex
Пользователь
 
Регистрация: 22.04.2017
Сообщений: 16
По умолчанию

Я понял, эта строчка тут вовсе ненужна, нужно просто через update как-то в таблице var_ref столбец id_var сделать по порядку, но как это сделать, я пока не знаю(
У кого-нибудь есть мысли по этому поводу?
Gurza-Alex вне форума Ответить с цитированием
Старый 11.05.2017, 21:59   #16
Gurza-Alex
Пользователь
 
Регистрация: 22.04.2017
Сообщений: 16
По умолчанию

Вот готовый вариант, что я сделал
Код:
if object_id('var_refresh') is not null
drop proc var_refresh
go
create proc var_refresh
@kol int
as

declare @count	int
set @count=1
while(@count<@kol)
begin
	declare @check	bigint
	declare @check1	bigint
	declare @id1 int
	declare @check_id_var int
	declare @check_n bigint
	declare @n	int
	declare @id_var	int
	declare @id int
	declare @var int
	declare @id_object int
	declare @v int
	set @id=1
	set @n=1

	select @id_object=max(id_objects) from variants
	select @id_var=max(id_var) from var_ref
insert into all_var values(@count)
	while(@id<@id_object+1)--Запись таблицы в var_ref
	begin
		select @v=max(variant) from variants where id_objects=@id
		set @v=@v-1
		select @var=variant from variants where variant=ROUND(rand()*@v,0)+1

		insert into var_ref values(newid(),@id, @var,@count)

		set @id=@id+1
	end


	
SELECT @check_n=SUM(CHECKSUM(id_objects,variant)) from var_ref where id_var=@n
	if(@id_var is NULL)
		begin
			set @check_n=1
		end



set @id_var=1
while (@id_var<@kol)
begin
	SELECT @check_id_var=SUM((CHECKSUM(id_objects,variant))) from var_ref where id_var=@id_var

	insert into t values(@id_var,@check_id_var)
	set @id_var=@id_var+1
	
end
set @id=1
while (@id<@kol)
begin
	
	select @check=chek from t where id=@id
	set @id1=1
	while(@id1<@kol)
	begin
		select @check1=chek from t where id=@id1

	if(@check1=@check and @id<>@id1)
		begin
			delete var_ref where id_var=@id1
			delete t where id=@id1
			set @id1=@id1+1
		end
	else
		begin	
			set @id1=@id1+1
		end
	
	end
	set @id=@id+1

end

set @count=@count+1

end

declare	@object		int
declare @idi		varchar(255)
declare @id_variant	int
declare @counti		int
declare @id1i		int
declare @id2		int
declare @id3		int
set @counti=1
set @id_variant=1
select @object=max(id_objects) from var_ref
declare @cursor cursor 
set @cursor=cursor scroll
for select * from var_ref order by 4,2
open @cursor
fetch @cursor into @idi,@id1i,@id2,@id3
while @@fetch_status=0
begin
	update var_ref set id_var=@id_variant where id=@idi	
	set @counti=@counti+1	
	if(@counti=@object+1)
		begin
			set @counti=1	
			set @id_variant=@id_variant+1
		end
	fetch next from @cursor into @idi,@id1i,@id2,@id3
end
close @cursor
deallocate @cursor
Gurza-Alex вне форума Ответить с цитированием
Старый 12.05.2017, 09:08   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А так для таблички Tempvar
Код:
CREATE TABLE Tempvar (comp int NOT NULL, variant int NOT NULL)

INSERT INTO Tempvar values (1,1),(1,2),(1,3),
                           (2,1),(2,2),(2,3),(2,4),
                           (3,1),(3,2),
                           (4,1),(4,2),(4,3),(4,4),(4,5)
120 варианов по 4 строки, всего строк 480
Код:
CREATE TABLE Tempvar1 (
  id int IDENTITY(1,1) NOT NULL,
  comp1 int NOT NULL, variant1 int NOT NULL,
  comp2 int NOT NULL, variant2 int NOT NULL,
  comp3 int NOT NULL, variant3 int NOT NULL,
  comp4 int NOT NULL, variant4 int NOT NULL)

INSERT INTO Tempvar1
SELECT T1.comp AS comp1,T1.variant AS variant1,
    T2.comp AS comp2,T2.variant AS variant2,
    T3.comp AS comp3,T3.variant AS variant3,
    T4.comp AS comp4,T4.variant AS variant4
  FROM Tempvar T1,Tempvar T2,Tempvar T3,Tempvar T4
  WHERE T1.comp=1 AND T2.comp=2 AND T3.comp=3 AND T4.comp=4
  ORDER BY T1.comp,T1.variant,T2.comp,T2.variant,T3.comp,T3.variant,T4.comp,T4.variant

SELECT id,comp1,variant1 FROM Tempvar1
UNION ALL
SELECT id,comp2,variant2 FROM Tempvar1
UNION ALL
SELECT id,comp3,variant3 FROM Tempvar1
UNION ALL
SELECT id,comp4,variant4 FROM Tempvar1
ORDER BY 1,2,3
--DROP TABLE Tempvar1
Или динамически формировать, что бы не ручками каждый раз
Код:
DECLARE @comp int,
        @s varchar(max),
        @s1 varchar(max),
        @s21 varchar(max),
        @s22 varchar(max),
        @s23 varchar(max),
        @s24 varchar(max),
        @s3 varchar(max)
DECLARE TempCursor CURSOR FOR SELECT comp FROM Tempvar GROUP BY comp ORDER BY comp
OPEN TempCursor
FETCH NEXT FROM TempCursor INTO @comp
SET @s1 = ''
SET @s21 = ''
SET @s22 = ''
SET @s23 = ''
SET @s24 = ''
SET @s3 = ''
WHILE @@FETCH_STATUS = 0 BEGIN
  SET @s = CAST(@comp AS varchar)
  SET @s1 = @s1+'comp'+@s+' int NOT NULL, variant'+@s+' int NOT NULL,'
  SET @s21 = @s21+'T'+@s+'.comp AS comp'+@s+',T'+@s+'.variant AS variant'+@s+','
  SET @s22 = @s22+'Tempvar T'+@s+','
  SET @s23 = @s23+' T'+@s+'.comp='+@s+' AND'
  SET @s24 = @s24+'T'+@s+'.comp,T'+@s+'.variant,'
  SET @s3 = @s3+' SELECT id,comp'+@s+',variant'+@s+' FROM Tempvar1 UNION ALL'
  FETCH NEXT FROM TempCursor INTO @comp
END
CLOSE TempCursor
DEALLOCATE TempCursor
SET @s = 'CREATE TABLE Tempvar1 (id int IDENTITY(1,1) NOT NULL,'+LEFT(@s1,LEN(@s1)-1)+')'
EXEC (@s) 
SET @s = 'INSERT INTO Tempvar1 SELECT '+LEFT(@s21,LEN(@s21)-1)+' FROM '+LEFT(@s22,LEN(@s22)-1)+
         ' WHERE '+LEFT(@s23,LEN(@s23)-4)+' ORDER BY '+LEFT(@s24,LEN(@s24)-1)
EXEC (@s)
SET @s = LEFT(@s3,LEN(@s3)-10)+' ORDER BY 1,2,3'
EXEC (@s)
--DROP TABLE Tempvar1
Повторюсь - это все для разумного количества компьютеров и вариантов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.05.2017, 20:02   #18
katenka141
Новичок
Джуниор
 
Регистрация: 15.05.2017
Сообщений: 1
По умолчанию

надо( и будет примерно до 54 компа и до 6 вариантов...
Я знаю что это сочетание, но как можно написать не со статическими параметрами, я не знаю( пытался что-то найти, но то бред, то не то, то еще фигня какая-то... Вот и мучаюсь думаю, уже почти месяц над этой фигней работаю, остальное все нормально, хотя там тоже не меньше строк и работ... А тут загвоздка(
Есть предложения как это можно реализовать?
ege.org.ru
ege.net.ru
katenka141 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создание массива вариантов mahatmaQL Общие вопросы Delphi 4 27.06.2016 00:15
Перебор вариантов Kirom Помощь студентам 2 27.01.2015 18:45
перебор вариантов luffi Общие вопросы Delphi 2 05.12.2011 16:47
выбор возможных вариантов Asante Microsoft Office Excel 2 02.12.2011 16:34
Построение матрицы вариантов раскроя max1m9 Microsoft Office Excel 0 07.06.2010 17:27