Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Распределение продукции по группам  [new]
VMedic
Member

Откуда: SPb
Сообщений: 9
Здравствуйте!
Имеется таблица с продукцией и характеристиками продуктов (min и max возможное значение):
id, min1, max1, min2, max2, min3, max3.
Помогите, пожалуйста, распределить продукцию по группам. При этом для любой пары групп каждый товар одной группы должен превосходить каждый товар другой группы по всем характеристикам (min и max). Количество групп максимально возможное.
Необходимо вывести min и max значение id и характеристик продуктов для каждой группы.
6 апр 09, 23:31    [7029697]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ни чо не понятно...
Пример создания таблицы, наполнения её тестовыми данными и вариан желаемого результата приведите, желательно в соответствие с рекомендациями по оформлению сообщений п.6. (тут вверху висит ссылка).

Сообщение было отредактировано: 7 апр 09, 11:22
7 апр 09, 07:10    [7029965]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
VMedic
Member

Откуда: SPb
Сообщений: 9
CREATE TABLE tbl(id INT NOT NULL PRIMARY KEY, min1 INT NOT NULL, max1 INT NOT NULL
, min2 INT NOT NULL, max2 INT NOT NULL, min3 INT NOT NULL, max3 INT NOT NULL);

INSERT INTO tbl VALUES(100,10100,10100,8000,8000,5000,5000);
INSERT INTO tbl VALUES(130,10060,10060,7700,7700,4500,4500);
INSERT INTO tbl VALUES(140,10060,10060,7600,7600,4500,4500);
INSERT INTO tbl VALUES(150,10050,10050,7600,7600,4500,4500);
INSERT INTO tbl VALUES(600,10004,10004,6700,6700,20,2700);
INSERT INTO tbl VALUES(700,10003,10003,6600,6600,2600,2600);
INSERT INTO tbl VALUES(800,10003,10003,6600,6600,2,2600);
INSERT INTO tbl VALUES(1000,10002,10002,6500,6500,2500,2500);
INSERT INTO tbl VALUES(1121,600,750,128,128,40,40);

Необходимо вывести:
minid, maxid, min1, max1, min2, max2, min3, max3
100, 100, 10100, 10100, 8000, 8000, 5000, 5000;
130, 150, 10050, 10060, 7600, 7700, 4500, 4500;
600, 1121, 600, 10004, 128, 6700, 2, 2700;
7 апр 09, 10:02    [7030363]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Все равно не ясно
1) Какой смысл Вы вкладываете в понятие "группа" ?
2) Что такое "пара групп" ?
3) Какие группы можно объединять в пары, а какие - нет (и почему)?
4) Что такое "превосходят"? Минимум превосходит другой минимум если он меньше, или если он больше?
5) Поясните на русском языке по шагам алгоритм нахождения желаемого результата (из примера я, например, этот алгоритм не понял)...
7 апр 09, 11:03    [7030817]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
VMedic
Member

Откуда: SPb
Сообщений: 9
Имеется набор товаров. Нужно распределить товары по группам. При этом должны соблюдаться условия:
1. Для ЛЮБОЙ пары групп ВСЕ товары одной из них (групп) должны иметь все min характеристики большие всех max характеристик другой группы (см. выше пример).
2. Количество групп максимально возможное.
7 апр 09, 11:26    [7031012]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Вопросов я задал пять
Ответов получил два (и явно не на мои вопросы)

Вы, наверное, никуда не спешите, и решили максимально затянуть время решения задачи?
Что ж, и мне спешить некуда...
7 апр 09, 11:36    [7031107]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
VMedic
Member

Откуда: SPb
Сообщений: 9
1) Смысл: группы различаются своей "производительностью" (чем больше характеристика товара - тем выше "производительность");
2) "Пара групп" - ЛЮБЫЕ две группы;
3) Все группы можно объединять в пары (см. п.2);
4) Группа превосходит другую по какой-либо характеристике, если минимальные значения этой характеристики для всех товаров этой группы больше максимальных значений этой характеристики для всех товаров другой группы;
5) если бы я знал алгоритм, то за помощью не обращался бы.
7 апр 09, 11:56    [7031357]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Повторяю - что такое группа?

Возьмем одну любую запись из tbl. Это группа?
Возьмем любые две записи. Это группа?
Возьмем все записи. Это тоже группа?
7 апр 09, 12:05    [7031458]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
VMedic
Member

Откуда: SPb
Сообщений: 9
Группа - любое количество записей! Главное, чтобы условия выполнялись и количество групп было максимальным (иначе, можно создать одну группу из всех записей).
7 апр 09, 12:24    [7031613]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Если группой всегда считать одну запись,
будет ли количество групп максимальным?
7 апр 09, 12:26    [7031629]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
VMedic
Member

Откуда: SPb
Сообщений: 9
Можно распределить все записи на группы, состоящие из одной записи.
Главное, чтобы выполнились условия.
В данном случае количество групп будет максимально возможным.
7 апр 09, 12:30    [7031665]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Попробуем сделать алгоритм по шагам на русском языке:
1) Принимаем, что каждая запись будет группой
2) Проверяем все возможные пары, и выясняем, что для одной из пар не выполняется условие
VMedic
для любой пары групп каждый товар одной группы должен превосходить каждый товар другой группы по всем характеристикам (min и max)
И что теперь делать? Наверное, кого-то с кем-то объединять в одну группу по какому-то признаку...
Но кого, с кем, и по какому признаку?

Напишите, пожалуйста, шаг 3
7 апр 09, 12:44    [7031781]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
vino
Member

Откуда:
Сообщений: 1191
Задача напоминает кластеризацию данных, но там, как минимум, должен быть интегральный параметр, по которому определяется момент потери существенных характеристик на N-ной итерации. А здесь что является таким параметром - сумма расстояний между min# одной записи и max# другой записи? А когда в группе две и более записей, по какому закону определять центр характеристик? А расстояние?
VMedic
1) Смысл: группы различаются своей "производительностью" (чем больше характеристика товара - тем выше "производительность");
2) "Пара групп" - ЛЮБЫЕ две группы;
3) Все группы можно объединять в пары (см. п.2);
4) Группа превосходит другую по какой-либо характеристике, если минимальные значения этой характеристики для всех товаров этой группы больше максимальных значений этой характеристики для всех товаров другой группы;
5) если бы я знал алгоритм, то за помощью не обращался бы.

Судя по этой фразе Вам скорее надо сначала обратиться в ветку Программирование, чтобы некие особо пытливые умы сочинили таки алгоритм. А реализовать его на SQL здесь помогут, конечно.
7 апр 09, 13:41    [7032427]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
vino
Member

Откуда:
Сообщений: 1191
VMedic
Имеется набор товаров. Нужно распределить товары по группам. При этом должны соблюдаться условия:
1. Для ЛЮБОЙ пары групп ВСЕ товары одной из них (групп) должны иметь все min характеристики большие всех max характеристик другой группы (см. выше пример).
2. Количество групп максимально возможное.

Уточните формулу (условие) расстояния.
Например, по цитате выходит условие (min1 > max1) and (min1 > max2) and (min1 > max3) and (min2 > max1) and (min2 > max2) and (min2 > max3) and (min3 > max1) and (min3 > max2) and (min3 > max3), проверяемое для каждой пары записей, а minid, maxid к процессу группировки не относятся?
7 апр 09, 13:55    [7032588]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
vino
Member

Откуда:
Сообщений: 1191
Следующий вопрос - что считать min# и max# для групп?
7 апр 09, 13:58    [7032632]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
VMedic
Member

Откуда: SPb
Сообщений: 9
vino

Уточните формулу (условие) расстояния.


(min1>max1) & (min2>max2) & (min3>max3)
7 апр 09, 14:50    [7033272]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
VMedic
Member

Откуда: SPb
Сообщений: 9
vino
Следующий вопрос - что считать min# и max# для групп?


SELECT MIN(min1),MAX(max1) ...
FROM ...
GROUP BY ...
7 апр 09, 14:52    [7033302]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
VMedic
Member

Откуда: SPb
Сообщений: 9
Паганель
И что теперь делать? Наверное, кого-то с кем-то объединять в одну группу по какому-то признаку...
Но кого, с кем, и по какому признаку?

Напишите, пожалуйста, шаг 3


Объединяем эти две группы в одну, обновляем минимумы и максимумы для каждой характеристики, запускаем итерацию заново.
Но с помощью рекурсивного CTE задачу я уже решил. Меня интересует решение без рекурсии. Я уверен, что оно должно быть.
7 апр 09, 15:14    [7033536]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Распределение продукции по группам  [new]
vinnikiser
Member

Откуда:
Сообщений: 13
Получилось ли найти решение?
Тоже интересует аналогичный вопрос - как решить такую задачу без рекурсии?
15 май 14, 10:02    [16019306]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
user89
Member

Откуда:
Сообщений: 2083
vinnikiser,

согласен, задачка интересная, но как и Паганель, я не понял принцип, как из таблицы
idmin1max1min2max2min3max3
10010100101008000800050005000
13010060100607700770045004500
14010060100607600760045004500
15010050100507600760045004500
600100041000467006700202700
70010003100036600660026002600
80010003100036600660022600
100010002100026500650025002500
11216007501281284040

получить границы (пары)
minIDmaxID
100100
130150
6001121
15 май 14, 11:24    [16019862]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
vinnikiser
Member

Откуда:
Сообщений: 13
user89, попробую объяснить принцип группировки записей:
I.
Возьмём первую запись с id = 100.
1) Её значение min1 не входит ни в один диапазон между min1 и max1 каких-либо других записей - не группируем id 100 с какой либо записью;
2) Значение max1 аналогично не входит ни в один из диапазонов - не группируем;
3) По аналогии min2, max2, min3, max3 - не группируем;
4) Получается minID = 100, maxID = 100 - это первая группа.
II.
Возьмём вторую запись с id = 130.
1) Её значение min1 входит в диапазон между min1 и max1 id = 140 - группируем id = 130 с id = 140;
2) Её значение max1 входит в диапазон между min1 и max1 id = 140 - группируем id = 130 с id = 140;
3) По аналогии значения min2 и max2;
4) Её значение min3 входит в диапазон между min3 и max3 id = 140, а также в диапазон между min3 и max3 id = 150 - группируем id = 130, id = 140 и id = 150;
5) minID = 130, maxID = 150 - вторая группа.
III. - IV. - id (140, 150) - аналогично id = 130 - результат minID = 130, maxID = 150 - вторая группа (т.к. такая группа уже есть - добавлять не нужно).

В общем, смысл такой, если какое-либо значение какого-либо параметра одной записи входит в диапазон значений этого же параметра другой записи - группируем.

Помогите, пожалуйста, разобраться... Если нужно - могу ещё примеры привести.
15 май 14, 11:54    [16020085]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
vinnikiser
Member

Откуда:
Сообщений: 13
Попробую привести такой пример:
*блин, как тут таблицы рисовать?) только тэгами HTML?
пример во вложении.

К сообщению приложен файл. Размер - 99Kb
15 май 14, 12:22    [16020290]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
vinnikiser
Member

Откуда:
Сообщений: 13
Прошу прощения, в записях c id = 4 и id = 5 в столбцах min2 и max2 ошибки, вот правильный пример:

К сообщению приложен файл. Размер - 102Kb
15 май 14, 12:25    [16020319]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
DECLARE @tbl TABLE (id INT NOT NULL PRIMARY KEY
   , min1 INT NOT NULL, max1 INT NOT NULL
   , min2 INT NOT NULL, max2 INT NOT NULL
   , min3 INT NOT NULL, max3 INT NOT NULL
	);
INSERT INTO @tbl VALUES
   (100,10100,10100,8000,8000,5000,5000),
   (130,10060,10060,7700,7700,4500,4500),
   (140,10060,10060,7600,7600,4500,4500),
   (150,10050,10050,7600,7600,4500,4500),
   (900,10004,10004,6700,6700,20,2700),
   (700,10003,10003,6600,6600,2600,2600),
   (800,10003,10003,6600,6600,2,2600),
   (1000,10002,10002,6500,6500,2500,2500),
   (1121,600,750,128,128,40,40);

DECLARE @itog TABLE (
   id1 INT, id2 int
   , min1 INT NOT NULL, max1 INT NOT NULL
   , min2 INT NOT NULL, max2 INT NOT NULL
   , min3 INT NOT NULL, max3 INT NOT NULL
   );

INSERT INTO @itog
select 
    min(b.id) i1, max(b.id) i2
   ,min(b.min1)min1, max(b.max1)max1
   ,min(b.min2)min2, max(b.max2)max2
   ,min(b.min3)min3, max(b.max3)max3
from @tbl a
join @tbl b on
   not (a.max1<b.min1 and a.max2<b.min2 and a.max3<b.min3) and -- ~(A<B) & ~(A>B) => A=B
   not (b.max1<a.min1 and b.max2<a.min2 and b.max3<a.min3) -- т.е. (a,b) в одной группе 
group by a.id

-- свертывание групп
select min(g.id1)id1, g.id2
   ,min(g.min1)min1, max(g.max1)max1
   ,min(g.min2)min2, max(g.max2)max2
   ,min(g.min3)min3, max(g.max3)max3
from (
   select g.id1, max(g.id2)id2
      ,min(g.min1)min1, max(g.max1)max1
      ,min(g.min2)min2, max(g.max2)max2
      ,min(g.min3)min3, max(g.max3)max3
   from @itog g
   group by g.id1
   )g
group by g.id2

Предварительный итог
id1id2min1max1min2max2min3max3
10010010100101008000800050005000
13015010050100607600770045004500
13015010050100607600770045004500
13015010050100607600770045004500
70090010003100046600670022700
700112160010004128670022700
700112160010004128670022700
800100010002100046500670022700
800112160010004128670022700

Свернутый итог
id1id2min1max1min2max2min3max3
10010010100101008000800050005000
13015010050100607600770045004500
700112160010004128670022700
15 май 14, 12:51    [16020539]     Ответить | Цитировать Сообщить модератору
 Re: Распределение продукции по группам  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Думается, что свертка групп по идентификаторам не корректна: мало ли какие там цифири, внутри диапазона
Однако вопрос звучал именно так - диапазоны идентификаторов...
Так что может быть и правильно, хотя не уверен Картинка с другого сайта.
15 май 14, 13:13    [16020725]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить