Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Задача на пересечение множеств.  [new]
ИнтересующийсяСКЛ
Guest
Добрый день, есть следующая задача.
Исключить множества которые имеют повторения двух элементов.
Например:
Множество 1
1
2
3
4
5

Множество 2
4
5
6
7
8

Множество 3
5
7
11
12

Множество 4
10
20
30

Оставить только Множество 4 т.к. в в 1-ом и 2-ом повторяется 4,5 а во втором и третьем 5,7.

Спасибо !
10 ноя 13, 12:02    [15104336]     Ответить | Цитировать Сообщить модератору
 Re: Задача на пересечение множеств.  [new]
ИнтересующийсяСКЛ
Guest
Хотя бы с какой стороны к этой задаче подступиться ?
10 ноя 13, 12:21    [15104362]     Ответить | Цитировать Сообщить модератору
 Re: Задача на пересечение множеств.  [new]
ИнтересующийсяСКЛ
Guest
Что настолько абстрактная задача ? :)
Ну тогда найти те торговые точки которые не посещали два одних и тех же человека которые посетили другую.
Хотя суть одно и то же. Хотя я может, конечно, чего то недопонимаю.
10 ноя 13, 13:34    [15104434]     Ответить | Цитировать Сообщить модератору
 Re: Задача на пересечение множеств.  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
1. определяешь кол-во совпадений для каждого значения
2. каждому множеству сопоставляешь максимальное значение от п.(1) среди его значений
3. выводишь множество, где п(2) равняется "1"
10 ноя 13, 13:50    [15104456]     Ответить | Цитировать Сообщить модератору
 Re: Задача на пересечение множеств.  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Также можно и через бороду подзапросов с exists/not exists, но это уже словами объяснить не так просто
10 ноя 13, 13:51    [15104462]     Ответить | Цитировать Сообщить модератору
 Re: Задача на пересечение множеств.  [new]
ИнтересующийсяСКЛ
Guest
Что то как то черезчур запутанно, попробую что то в этом роде.



автор
1. определяешь кол-во совпадений для каждого значения
2. каждому множеству сопоставляешь максимальное значение от п.(1) среди его значений
3. выводишь множество, где п(2) равняется "1"
10 ноя 13, 13:55    [15104467]     Ответить | Цитировать Сообщить модератору
 Re: Задача на пересечение множеств.  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
declare @m table (m_id int primary key);
declare @t table (m_id int, v int, primary key (m_id, v));

insert into @m
values
 (1), (2), (3), (4);

insert into @t
values
 (1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
 (2, 4), (2, 5), (2, 6), (2, 7), (2, 8),
 (3, 5), (3, 7), (3, 11), (3, 12),
 (4, 10), (4, 20), (4, 30);

select
 m.m_id
from
 @m m
where
 not exists(
  select
   1
  from
   @t a join
   @t b on b.m_id <> a.m_id and b.v = a.v
  where
   a.m_id = m.m_id
  group by
   a.m_id, b.m_id
  having
   count(*) = 2
 );
10 ноя 13, 14:33    [15104541]     Ответить | Цитировать Сообщить модератору
 Re: Задача на пересечение множеств.  [new]
aleks2
Guest
declare @sets table(setID int, setMember int,  primary key clustered (setID, setMember) );

insert @sets
  values (1, 1)
       , (1, 2)
       , (1, 3)
       , (1, 4)       
       , (1, 5)

       , (2, 4)
       , (2, 5)       
       , (2, 6)
       , (2, 7)
       , (2, 8)

       , (3, 5)
       , (3, 7)
       , (3, 11)
       , (3, 12)

       , (4, 10)
       , (4, 20)
       , (4, 30)
;       
select * 
 from @sets s 
 where not exists( select ss.SetID 
                    from @sets ss 
                         inner join @sets sss on ss.SetID <> sss.setID and ss.setMember = sss.setMember 
                    where ss.SetID = s.SetID
                    group by ss.SetID
                    having COUNT(*) >= 2
                    
                  );
                  
10 ноя 13, 14:40    [15104561]     Ответить | Цитировать Сообщить модератору
 Re: Задача на пересечение множеств.  [new]
ИнтересующийсяСКЛ
Guest
Всем спасибо, буду разбираться :)
10 ноя 13, 15:01    [15104608]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить