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

Откуда:
Сообщений: 38
Добрый день!

Есть таблица содержащая данные - Id объекта, Id свойства, Значение свойства
IF OBJECT_ID('tempdb..#Data') IS NOT NULL
   drop table #Data
CREATE TABLE #Data(ObjectId int,PropertyId int, PropertyValue int)
INSERT INTO #Data VALUES 
(1,1,10),
(1,2,5),
(1,3,6),
(2,1,10),
(2,2,5),
(2,3,6),
(3,1,10),
(3,2,4),
(4,1,10),
(4,2,6)


Нужно вывести отчет по объектам у которых есть одинаковые наборы свойств (свойство одинаковы у объектов если Id свойства и значение совпадают с Id и значением свойства другого объекта) в виде:
Группа 1:

ObjectId1,ObjectId2, ... ObjectIdN (список объектов имеющих одинаковые свойства)
--------------------------------------------------------------------------------------
PropertyId1, PropertyValue1
......
PropertyIdN, PropertyValueN

Группа 2:

ObjectId1,ObjectId2, ... ObjectIdN (список объектов имеющих одинаковые свойства)
--------------------------------------------------------------------------------------
PropertyId1, PropertyValue1
......
PropertyIdN, PropertyValueN

Группа N:
................

В идеале хотелось бы иметь отчет содержащий минимальное количество групп (т.е N = минимально возможное значение)

В случае выше приведенного в скрипте примера должно получиться что то на подобии:

Группа 1:

1,2,3,4
--------------------
1,10

Группа 2:

1,2
--------------------
2,5
3,6

Группа 3:

3
--------------------
2,4

Группа 4:

4
--------------------
2,6
13 май 15, 16:46    [17635571]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм поиска минимального количества групп  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Найдите все уникальные пары PropertyId, PropertyValue, для каждой пары создайте строки списка ObjectId, отсортируйте по строкам ObjectId и парам.
13 май 15, 17:10    [17635755]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм поиска минимального количества групп  [new]
o-o
Guest
declare @t table(ObjectId int,PropertyId int, PropertyValue int)
INSERT INTO @t VALUES 
(1,1,10),
(1,2,5),
(1,3,6),
(2,1,10),
(2,2,5),
(2,3,6),
(3,1,10),
(3,2,4),
(4,1,10),
(4,2,6)

select t.PropertyId, t.PropertyValue
,stuff((select ', '+ cast(ObjectId as varchar(10)) 
        from @t tt 
         where tt.PropertyId=t.PropertyId and tt.PropertyValue=t.PropertyValue
         order by tt.ObjectId for xml path('')),1,2,'') ObjectId
from @t t
group by t.PropertyId, t.PropertyValue
order by t.PropertyId, t.PropertyValue;
---
1	10	1, 2, 3, 4
2	4	3
2	5	1, 2
2	6	4
3	6	1, 2
13 май 15, 17:22    [17635853]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм поиска минимального количества групп  [new]
Goldy_D
Member

Откуда:
Сообщений: 38
o-o,
На группы содержащие одно свойство поделить не проблема, а вот как сгруппировать чтобы в группе могло быть несколько свойств? Например как в моем примере - группа 2 содержит 2 общих свойства

Группа 2:

1,2
--------------------
2,5
3,6
13 май 15, 17:38    [17635972]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм поиска минимального количества групп  [new]
Добрый Э - Эх
Guest
Goldy_D,

твоя задача называется "реляционное деление". вот и ищи про него...
13 май 15, 17:40    [17635984]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм поиска минимального количества групп  [new]
o-o
Guest
Goldy_D,

+ двойной изврат:

declare @t table(ObjectId int,PropertyId int, PropertyValue int)
INSERT INTO @t VALUES 
(1,1,10),
(1,2,5),
(1,3,6),
(2,1,10),
(2,2,5),
(2,3,6),
(3,1,10),
(3,2,4),
(4,1,10),
(4,2,6);

with cte as(
select t.PropertyId, t.PropertyValue
,stuff((select ', '+ cast(ObjectId as varchar(10)) 
        from @t tt 
         where tt.PropertyId=t.PropertyId and tt.PropertyValue=t.PropertyValue
         order by tt.ObjectId for xml path('')),1,2,'') as gr
from @t t
group by t.PropertyId, t.PropertyValue
)

select t.gr
,stuff((select ', '+ '[' + cast(PropertyId as varchar(10)) + ',' + cast(PropertyValue as varchar(10)) +']' 
        from cte tt 
         where tt.gr=t.gr 
         order by tt.gr for xml path('')),1,2,'') as [PropertyId, PropertyValue]
from cte t
group by t.gr
13 май 15, 17:52    [17636071]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм поиска минимального количества групп  [new]
Владислав Колосов
Member

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

1,2
--------------------
2,5
3,6


так правильно:
2,5 1,2
3,6 1,2

Визуальное представление строит отчёт, а не запрос.
13 май 15, 18:34    [17636280]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить